设有下面的配置文件(1.txt):
# 简单的“键值”配置文件样例
# 支持“=”和“:”两种赋值方式
# ① 注释语句采用'#'符号顶格写
# ② “键”为由数字或大小写字母组成的串,“值”不限制
# ③ “键”及“值”两边可以有空格、制表符(\t)
# ③ 配置文件中可以存在空行
XYZ = 89
abc : 1233
Y = 78888
N = 111ABC
M= ABC222
Name : Zhang_001
Mail: Hello@gmail.com
PosX: 1900
PosY : 900
Data = 7,999,000
解析程序(里面主要用到了sscanf函数):
#include <stdio.h>
#include <string.h>
//
// 删除一个字符串两端的空格
//
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;
}