📄 read_ini.c
字号:
#include<stdio.h>#include<stdlib.h>#include<string.h>/*表示类型的宏*/#define STRSTR 0#define STRINT 1#define STRFLOAT 2#define STRDOUBLE 3/*判断空白*/#define isblank(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\r')/*×INI配置文件的格式:×ini文件由多行字符串组成,这些字符可以划分为三种类型:×(1)数据域:×为配置数据项的分类,此字符串由“【 ”开始,以“】”结束,在中括号之间的即为数据域×(2)配置项×字符串格式为:“配置项名称 = 配置项取值”,相当于一个以“= ”分隔的固定分隔字符串×它只有2个数据域,第一个域是配置项的名称,第二个域是配置项的值×(3)注释行×以“# ”开始的即为注释行 */ /* 字符串报文库 */typedef struct STRRESVARstu{ int nAmount; /* 数据域总数 */ int nFlag; /* 0:定长域;1:分隔域 */ int *filedlen; /* 每个域的长度 */ int nCompartlen; /* 分隔符号的长度 */ char szCompart[10]; /* 分隔字符串 */ char **filedaddr; /* 指向每个域首的指针 */} STRRESVAR;typedef STRRESVAR *PSTRRESVAR;/*删除空白字符*/char * trim_string(char* sz_dest){ int n, n_len; if (sz_dest != NULL){ /* ―――― 以下删除字符串右边的空格 ―――― */ for (n = strlen(sz_dest); n > 0; n--){ if (!isblank(sz_dest[n - 1])) break; } sz_dest[n] = '\0'; /* 将右边最靠左的一个空格替换为0 */ /* ―――― 以下删除字符串左边的空格 ―――― */ n_len = strlen(sz_dest); for (n = 0; n < n_len; n++){ if (!isblank(sz_dest[n])) break; } strcpy(sz_dest, sz_dest + n); /* 从左边第一个非空格起向前移动到串首既可*/ } return sz_dest;}/**/int strrespre(char *buf, PSTRRESVAR pstr_stu){ int i = 0, j = 0; char *p1, *p2; if (pstr_stu->nFlag == 0) /* 固定长度报文 */ { for (i=0; i<pstr_stu->nAmount; i++) { pstr_stu->filedaddr[i] = buf + j; j = j + pstr_stu->filedlen[i] + pstr_stu->nCompartlen; } } else /* 固定分隔报文 */ { p1 = buf; p2 = p1; while (p1 != NULL && i<= pstr_stu->nAmount) { pstr_stu->filedaddr[i] = p1; /* p1指向数据域首地址 */ p2 = strstr(p1, pstr_stu->szCompart); if (p2 == NULL) /* 最后一个数据域 */ { pstr_stu->filedlen[i] = strlen(p1); p1 = NULL; } else /* 非最后一个数据域 */ { pstr_stu->filedlen[i] = p2 - p1; /* 数据域长度 */ p1 = p2 + pstr_stu->nCompartlen; /* p1指向下一个数据域首地址 */ } i++; /* 当前解析的数据域编号 */ } } return 0;}/**/int strresvalue(char *buf, STRRESVAR Strstu, int nIndex, void *pValue, int nType){ char szStrbuf[1024]; memset(szStrbuf, 0, sizeof(szStrbuf)); /* 拷贝数据域原始信息 */ strncpy(szStrbuf, Strstu.filedaddr[nIndex],Strstu.filedlen[nIndex]); trim_string(szStrbuf); /* 清除原始数据首尾的空格 */ /* 转化数据类型并回传数据信息 */ switch (nType) { case STRINT : /* 整型 */ *(int *)pValue = atoi(szStrbuf); break; case STRDOUBLE: /* 浮点型 */ *(double *)pValue = atoi(szStrbuf); break; default: /* 缺省为字符型 */ strcpy((char *)pValue, szStrbuf); break; } return 0;}/*解析配置项字符串,*//**配置项字符串是一个以“=”分隔的,共有2个数据域的固定分隔的字符串报文,*该函数解析字符串报文并按照指定的数据类型返回配置项(第二号域)的取值*/int GetConfigStrValue(char *buf, void *p_value, int n_type){ char *n_ce_addr[2]; int n_ce_len[2]; STRRESVAR stu_str; stu_str.nAmount = 2; /* 数据域总数 */ stu_str.nFlag = 1; /* 固定分隔 */ stu_str.filedlen = n_ce_len; /* 每个域的长度 */ stu_str.nCompartlen = 1; /* 分隔符号的长度 */ strcpy(stu_str.szCompart, "="); /* 分隔字符串 */ stu_str.filedaddr = n_ce_addr; /* 指向每个域首的指针 */ strrespre(buf, &stu_str); /* 解析字符串报文 */ strresvalue(buf, stu_str, 1, p_value, n_type); return 0; }/*从指定的配置文件中读取指定的配置项的信息,读取szRoot数据域中的szName配置项的配置信息,保存于pValue*/int GetConfigValue(char *sz_path, char *sz_root, char *sz_name, void *p_value, int n_type){ FILE *fp; int nFlag = 0; /* 进入数据域的标志 */ static char buf[1024], sz_root_ext[100], sz_name_ext[100]; fp = fopen(sz_path, "r"); if(fp==NULL){ perror("open file error"); return -1; } sprintf(sz_root_ext, "[%s]", sz_root); /* 数据域“[szRoot]”格式 */ sprintf(sz_name_ext, "%s=", sz_name); /* 数据项“szName=“格式 */ while (feof(fp) == 0){ memset(buf, 0, sizeof(buf)); fgets(buf, sizeof(buf), fp); /* 读取文件中的每一行字符串 */ if (buf[0] == '#') continue; /* 注解行,跳过 */ /* 未进入数据域时,只查询数据域行 */ if (nFlag == 0 && buf[0] != '[') continue; /* 未进入数据域,当前处于数据域行 */ else if (nFlag == 0 && buf[0] == '[') { /* 匹配当前数据域是否为所求域 */ if (strncmp(buf, sz_root_ext, strlen(sz_root_ext)) == 0) nFlag = 1; } else if (nFlag == 1 && buf[0] == '['){ break; /* 数据域遍历完毕 */ } /* 遍历数据域中的配置项 */ else { /* 匹配当前配置项是否为所求项 */ if (strncmp(buf, sz_name_ext, strlen(sz_name_ext)) == 0){ /* 从配置项中分解配置取值 */ GetConfigStrValue(buf, p_value, n_type) == 0; fclose(fp); return 0; } } }//end of while fclose(fp); return -1;}int main(){ int nPort; char szIp[20]; char proco[20]; GetConfigValue("config.ini", "SERVER01", "IP", szIp, STRSTR); GetConfigValue("config.ini","SERVER01", "PORT", &nPort, STRINT); GetConfigValue("config.ini","SERVER01", "PROCOTOL", proco, STRSTR); printf(" IP=%s \n PORT=%d\n PROCOTOL=%s\n", szIp, nPort,proco); getchar(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -