⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 read_ini.c

📁 读取配置文件(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 + -