配置文件中“键=值”(key=val)字符串C语言解析

设有下面的配置文件(1.txt):

# 简单的“键值”配置文件样例
# 支持“=”和“:”两种赋值方式
# ① 注释语句采用'#'符号顶格写
# ② “键”为由数字或大小写字母组成的串,“值”不限制
# ③ “键”及“值”两边可以有空格、制表符(\t)	
# ③ 配置文件中可以存在空行


XYZ	=	89
abc	:	1233

Y	=	78888
N	=	111ABC	
M= ABC222
Name : Zhang_001
Mail: [email protected]		  
PosX:	 1900
PosY : 900
Data	= 7,999,000

解析程序(里面主要用到了sscanf函数):


#include 
#include 

//
//   删除一个字符串两端的空格
//
char *DelSpace(char *in);

//
// 【键】【值】数据结构定义
//
typedef struct
{
	char key[50];
	char val[50];
}KEY_VAL;



void main()
{
	//打开配置文件
	FILE *fp = fopen("1.txt", "r");
	if(!fp)
	{
		printf("配置文件读取失败\n");
		return;
	}

	//定义【键】【值】,但这里没有用到
	KEY_VAL kv[100];
	memset(kv, 0x00, sizeof(kv));

	char tmp[100]; //存放配置文件的每一行

	//
	// 解析配置文件
	//
	while (fgets(tmp, 100, fp))
	{

		//忽略注释语句
		if (tmp[0] == '#') continue;

		//忽略空行语句
		if (tmp[0] == '\n')	continue;


		char key[50] = {0};
		char val[50] = {0};


		if (strstr(tmp, "="))//【key=val】样式
		{
			sscanf(tmp, "%[0-9a-zA-Z\t ]=%s", key, val);
		}
		else if (strstr(tmp, ":"))//【key:val】样式
		{
			sscanf(tmp, "%[0-9a-zA-Z\t ]:%s", key, val);
		}

	
		//去掉【key】【val】字符串两边的空格
		char *k = DelSpace(key);
		char *v = DelSpace(val);


		//显示
		printf("源串: %s\t键= %s, 值= %s\n\n", tmp, k, v);

	}

	fclose(fp);
}

//
//   删除一个字符串两端的空格
//		返回修改后的串,小心该函数会修改输入串
//
char *DelSpace(char *in)
{
	char *out = NULL;
	char *p = in;


	while((*p == ' ')||(*p == '\t')) p++;	//略去字符串前面的空格

	out = p;	//保存输出串地址

	while(1)	//略去字符串后面的空格
	{
		if (*p == ' ')	break;
		if (*p == '\n') break;
		if (*p == '\0') break;
		if (*p == '\t') break;

		p++;
	}
	*p = '\0';


	return out;
}



你可能感兴趣的:(配置文件中“键=值”(key=val)字符串C语言解析)