336 lines
12 KiB
C
336 lines
12 KiB
C
/**********************************************************************
|
||
* 版权所有 (C)2015, Zhou Zhaoxiong。
|
||
*
|
||
* 文件名称:GetConfig.c
|
||
* 文件标识:无
|
||
* 内容摘要:演示Linux下配置文件的读取方法
|
||
* 其它说明:无
|
||
* 当前版本:V1.0
|
||
* 作 者:Zhou Zhaoxiong
|
||
* 完成日期:20150507
|
||
*
|
||
**********************************************************************/
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
|
||
// 数据类型重定义
|
||
typedef unsigned char UINT8;
|
||
typedef signed int INT32;
|
||
typedef unsigned int UINT32;
|
||
|
||
// 员工信息结构体定义
|
||
typedef struct
|
||
{
|
||
UINT8 szEmployeeName[128]; // 员工姓名
|
||
INT32 iEmployeeAge; // 员工年龄
|
||
} T_EmployeeInfo;
|
||
|
||
// 雇主信息结构体定义
|
||
typedef struct
|
||
{
|
||
UINT8 szEmployerName[128]; // 雇主姓名
|
||
INT32 iEmployerAge; // 雇主年龄
|
||
} T_EmployerInfo;
|
||
|
||
// 函数声明
|
||
void GetCompletePath(UINT8 *pszConfigFileName, UINT8 *pszWholePath);
|
||
void GetStringContentValue(FILE *fp, UINT8 *pszSectionName, UINT8 *pszKeyName, UINT8 *pszOutput, UINT32 iOutputLen);
|
||
void GetConfigFileStringValue(UINT8 *pszSectionName, UINT8 *pszKeyName, UINT8 *pDefaultVal, UINT8 *pszOutput, UINT32 iOutputLen, UINT8 *pszConfigFileName);
|
||
INT32 GetConfigFileIntValue(UINT8 *pszSectionName, UINT8 *pszKeyName, UINT32 iDefaultVal, UINT8 *pszConfigFileName);
|
||
INT32 main();
|
||
|
||
|
||
/**********************************************************************
|
||
* 功能描述:主函数
|
||
* 输入参数:无
|
||
* 输出参数:无
|
||
* 返 回 值:无
|
||
* 其它说明:无
|
||
* 修改日期 版本号 修改人 修改内容
|
||
* ---------------------------------------------------------------
|
||
* 20150507 V1.0 Zhou Zhaoxiong 创建
|
||
***********************************************************************/
|
||
INT32 main()
|
||
{
|
||
T_EmployeeInfo tEmployeeInfo = {0};
|
||
T_EmployerInfo tEmployerInfo = {0};
|
||
|
||
// 获取并打印员工信息
|
||
// 获取员工姓名
|
||
GetConfigFileStringValue("EMPLOYEEINFO", "EmployeeName", "", tEmployeeInfo.szEmployeeName, sizeof(tEmployeeInfo.szEmployeeName), "Config.ini");
|
||
|
||
// 获取员工年龄
|
||
tEmployeeInfo.iEmployeeAge = GetConfigFileIntValue("EMPLOYEEINFO", "EmployeeAge", 20, "Config.ini");
|
||
if (tEmployeeInfo.iEmployeeAge == -1) // 判断获取到的年龄是否正确
|
||
{
|
||
printf("Get EmployeeAge failed!\n");
|
||
return -1;
|
||
}
|
||
|
||
// 打印读取到的员工姓名和年龄
|
||
printf("EmployeeName is %s, EmployeeAge is %d\n", tEmployeeInfo.szEmployeeName, tEmployeeInfo.iEmployeeAge);
|
||
|
||
// 获取并打印雇主信息
|
||
// 获取雇主姓名
|
||
GetConfigFileStringValue("EMPLOYERINFO", "EmployerName", "", tEmployerInfo.szEmployerName, sizeof(tEmployerInfo.szEmployerName), "Config.ini");
|
||
|
||
// 获取员工年龄
|
||
tEmployerInfo.iEmployerAge = GetConfigFileIntValue("EMPLOYERINFO", "EmployerAge", 30, "Config.ini");
|
||
if (tEmployerInfo.iEmployerAge == -1) // 判断获取到的年龄是否正确
|
||
{
|
||
printf("Get EmployerAge failed!\n");
|
||
return -1;
|
||
}
|
||
|
||
// 打印读取到的员工姓名和年龄
|
||
printf("EmployerName is %s, EmployerAge is %d\n", tEmployerInfo.szEmployerName, tEmployerInfo.iEmployerAge);
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
/**********************************************************************
|
||
* 功能描述: 获取配置文件完整路径(包含文件名)
|
||
* 输入参数: pszConfigFileName-配置文件名
|
||
pszWholePath-配置文件完整路径(包含文件名)
|
||
* 输出参数: 无
|
||
* 返 回 值: 无
|
||
* 其它说明: 无
|
||
* 修改日期 版本号 修改人 修改内容
|
||
* ------------------------------------------------------------------
|
||
* 20150507 V1.0 Zhou Zhaoxiong 创建
|
||
********************************************************************/
|
||
void GetCompletePath(UINT8 *pszConfigFileName, UINT8 *pszWholePath)
|
||
{
|
||
UINT8 *pszHomePath = NULL;
|
||
UINT8 szWholePath[256] = {0};
|
||
|
||
// 先对输入参数进行异常判断
|
||
if (pszConfigFileName == NULL || pszWholePath == NULL)
|
||
{
|
||
printf("GetCompletePath: input parameter(s) is NULL!\n");
|
||
return;
|
||
}
|
||
|
||
pszHomePath = (UINT8 *)getenv("HOME"); // 获取当前用户所在的路径
|
||
if (pszHomePath == NULL)
|
||
{
|
||
printf("GetCompletePath: Can't find home path!\n");
|
||
return;
|
||
}
|
||
|
||
// 拼装配置文件路径
|
||
snprintf(szWholePath, sizeof(szWholePath)-1, "%s/PracticeDev/ini/%s", pszHomePath, pszConfigFileName);
|
||
|
||
strncpy(pszWholePath, szWholePath, strlen(szWholePath));
|
||
}
|
||
|
||
|
||
/**********************************************************************
|
||
* 功能描述: 获取具体的字符串值
|
||
* 输入参数: fp-配置文件指针
|
||
pszSectionName-段名, 如: GENERAL
|
||
pszKeyName-配置项名, 如: EmployeeName
|
||
iOutputLen-输出缓存长度
|
||
* 输出参数: pszOutput-输出缓存
|
||
* 返 回 值: 无
|
||
* 其它说明: 无
|
||
* 修改日期 版本号 修改人 修改内容
|
||
* ------------------------------------------------------------------
|
||
* 20150507 V1.0 Zhou Zhaoxiong 创建
|
||
********************************************************************/
|
||
void GetStringContentValue(FILE *fp, UINT8 *pszSectionName, UINT8 *pszKeyName, UINT8 *pszOutput, UINT32 iOutputLen)
|
||
{
|
||
UINT8 szSectionName[100] = {0};
|
||
UINT8 szKeyName[100] = {0};
|
||
UINT8 szContentLine[256] = {0};
|
||
UINT8 szContentLineBak[256] = {0};
|
||
UINT32 iContentLineLen = 0;
|
||
UINT32 iPositionFlag = 0;
|
||
|
||
// 先对输入参数进行异常判断
|
||
if (fp == NULL || pszSectionName == NULL || pszKeyName == NULL || pszOutput == NULL)
|
||
{
|
||
printf("GetStringContentValue: input parameter(s) is NULL!\n");
|
||
return;
|
||
}
|
||
|
||
sprintf(szSectionName, "[%s]", pszSectionName);
|
||
strcpy(szKeyName, pszKeyName);
|
||
|
||
while (feof(fp) == 0)
|
||
{
|
||
memset(szContentLine, 0x00, sizeof(szContentLine));
|
||
fgets(szContentLine, sizeof(szContentLine), fp); // 获取段名
|
||
|
||
// 判断是否是注释行(以;开头的行就是注释行)或以其他特殊字符开头的行
|
||
if (szContentLine[0] == ';' || szContentLine[0] == '\r' || szContentLine[0] == '\n' || szContentLine[0] == '\0')
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// 匹配段名
|
||
if (strncasecmp(szSectionName, szContentLine, strlen(szSectionName)) == 0)
|
||
{
|
||
while (feof(fp) == 0)
|
||
{
|
||
memset(szContentLine, 0x00, sizeof(szContentLine));
|
||
memset(szContentLineBak, 0x00, sizeof(szContentLineBak));
|
||
fgets(szContentLine, sizeof(szContentLine), fp); // 获取字段值
|
||
|
||
// 判断是否是注释行(以;开头的行就是注释行)
|
||
if (szContentLine[0] == ';')
|
||
{
|
||
continue;
|
||
}
|
||
|
||
memcpy(szContentLineBak, szContentLine, strlen(szContentLine));
|
||
|
||
// 匹配配置项名
|
||
if (strncasecmp(szKeyName, szContentLineBak, strlen(szKeyName)) == 0)
|
||
{
|
||
iContentLineLen = strlen(szContentLine);
|
||
for (iPositionFlag = strlen(szKeyName); iPositionFlag <= iContentLineLen; iPositionFlag ++)
|
||
{
|
||
if (szContentLine[iPositionFlag] == ' ')
|
||
{
|
||
continue;
|
||
}
|
||
if (szContentLine[iPositionFlag] == '=')
|
||
{
|
||
break;
|
||
}
|
||
|
||
iPositionFlag = iContentLineLen + 1;
|
||
break;
|
||
}
|
||
|
||
iPositionFlag = iPositionFlag + 1; // 跳过=的位置
|
||
|
||
if (iPositionFlag > iContentLineLen)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
memset(szContentLine, 0x00, sizeof(szContentLine));
|
||
strcpy(szContentLine, szContentLineBak + iPositionFlag);
|
||
|
||
// 去掉内容中的无关字符
|
||
for (iPositionFlag = 0; iPositionFlag < strlen(szContentLine); iPositionFlag ++)
|
||
{
|
||
if (szContentLine[iPositionFlag] == '\r' || szContentLine[iPositionFlag] == '\n' || szContentLine[iPositionFlag] == '\0')
|
||
{
|
||
szContentLine[iPositionFlag] = '\0';
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 将配置项内容拷贝到输出缓存中
|
||
strncpy(pszOutput, szContentLine, iOutputLen-1);
|
||
break;
|
||
}
|
||
else if (szContentLine[0] == '[')
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/**********************************************************************
|
||
* 功能描述: 从配置文件中获取字符串
|
||
* 输入参数: pszSectionName-段名, 如: GENERAL
|
||
pszKeyName-配置项名, 如: EmployeeName
|
||
pDefaultVal-默认值
|
||
iOutputLen-输出缓存长度
|
||
pszConfigFileName-配置文件名
|
||
* 输出参数: pszOutput-输出缓存
|
||
* 返 回 值: 无
|
||
* 其它说明: 无
|
||
* 修改日期 版本号 修改人 修改内容
|
||
* ------------------------------------------------------------------
|
||
* 20150507 V1.0 Zhou Zhaoxiong 创建
|
||
********************************************************************/
|
||
void GetConfigFileStringValue(UINT8 *pszSectionName, UINT8 *pszKeyName, UINT8 *pDefaultVal, UINT8 *pszOutput, UINT32 iOutputLen, UINT8 *pszConfigFileName)
|
||
{
|
||
FILE *fp = NULL;
|
||
UINT8 szWholePath[256] = {0};
|
||
|
||
// 先对输入参数进行异常判断
|
||
if (pszSectionName == NULL || pszKeyName == NULL || pszOutput == NULL || pszConfigFileName == NULL)
|
||
{
|
||
printf("GetConfigFileStringValue: input parameter(s) is NULL!\n");
|
||
return;
|
||
}
|
||
|
||
// 获取默认值
|
||
if (pDefaultVal == NULL)
|
||
{
|
||
strcpy(pszOutput, "");
|
||
}
|
||
else
|
||
{
|
||
strcpy(pszOutput, pDefaultVal);
|
||
}
|
||
|
||
// 打开配置文件
|
||
GetCompletePath(pszConfigFileName, szWholePath);
|
||
fp = fopen(szWholePath, "r");
|
||
if (fp == NULL)
|
||
{
|
||
printf("GetConfigFileStringValue: open %s failed!\n", szWholePath);
|
||
return;
|
||
}
|
||
|
||
// 调用函数用于获取具体配置项的值
|
||
GetStringContentValue(fp, pszSectionName, pszKeyName, pszOutput, iOutputLen);
|
||
|
||
// 关闭文件
|
||
fclose(fp);
|
||
fp = NULL;
|
||
}
|
||
|
||
|
||
/**********************************************************************
|
||
* 功能描述: 从配置文件中获取整型变量
|
||
* 输入参数: pszSectionName-段名, 如: GENERAL
|
||
pszKeyName-配置项名, 如: EmployeeName
|
||
iDefaultVal-默认值
|
||
pszConfigFileName-配置文件名
|
||
* 输出参数: 无
|
||
* 返 回 值: iGetValue-获取到的整数值 -1-获取失败
|
||
* 其它说明: 无
|
||
* 修改日期 版本号 修改人 修改内容
|
||
* ------------------------------------------------------------------
|
||
* 20150507 V1.0 Zhou Zhaoxiong 创建
|
||
********************************************************************/
|
||
INT32 GetConfigFileIntValue(UINT8 *pszSectionName, UINT8 *pszKeyName, UINT32 iDefaultVal, UINT8 *pszConfigFileName)
|
||
{
|
||
UINT8 szGetValue[512] = {0};
|
||
INT32 iGetValue = 0;
|
||
|
||
// 先对输入参数进行异常判断
|
||
if (pszSectionName == NULL || pszKeyName == NULL || pszConfigFileName == NULL)
|
||
{
|
||
printf("GetConfigFileIntValue: input parameter(s) is NULL!\n");
|
||
return -1;
|
||
}
|
||
|
||
GetConfigFileStringValue(pszSectionName, pszKeyName, NULL, szGetValue, 512-1, pszConfigFileName); // 先将获取的值存放在字符型缓存中
|
||
|
||
if (szGetValue[0] == '\0' || szGetValue[0] == ';') // 如果是结束符或分号, 则使用默认值
|
||
{
|
||
iGetValue = iDefaultVal;
|
||
}
|
||
else
|
||
{
|
||
iGetValue = atoi(szGetValue);
|
||
}
|
||
|
||
return iGetValue;
|
||
}
|