iniparser是一个C语言库,是针对INI文件的开源解析器。ini文件则是一些系统或者软件的配置文件。git地址如下:
https://github.com/ndevilla/iniparser
iniparser提供API接口对ini文件进行解析、配置、删除等操作。ini文件基本格式如下所示:
;地址池
[ipaddrpool]
start = 192.168.1.1
end = 192.168.1.100
[filepath]
leasefile = /var/dhcplease/dhcpd.leases
;网络接口
[network]
interface = en1
[opt]
dns1 = 8.8.8.8
dns2 = 8.8.8.8
subnet = 255.255.255.0
router = 192.168.3.1
domain = local
lease = 864
t1 = 432
t2 = 756
ini文件的最基本组成单元就是key或者叫property,每个key都有一个名称(name)和对应的值(value),例如:
start = 192.168.1.1
“start”就是名称name,“192.168.1.1”是对应的值;
我们还可以将多个Key归类为一组,即section。组名定义要独立一行,并用中括号括起来:
[ipaddrpool]
start = 192.168.1.1
end = 192.168.1.100
其中[ipaddrpool]就是组名,组成员有“start”、“end”;
在section声明下的keys都会和该section关联起来。一个section的作用域会在下一个section声明的地方结束,如果没有下section的声明,那么该section的结束地方就是该文件末尾。section是不可以嵌套的。定位一个key是用section:key来表示的,所以不同section下的key的名称是可以相同的。iniparser库处理名称的时候,会统一换成小写,所以section和property的名称命名是大小写无关的。
需要注意的是,每个组下的key是唯一的不能重复的,但不同组下可以存在相同key。
注释以分号开头:
;地址池
dictionary * iniparser_load(const char * ininame);
加载ini文件,将数据存于dictionary结构中
const char * iniparser_getstring(const dictionary * d, const char * key, const char * def);
获取对应key的value。key以组+key的形式体现,如“ipaddrpool:start”。value以字符串形式返回,若未找到对应的key则返回def 的内容。
int iniparser_set(dictionary * ini, const char * entry, const char * val);
修改dictionary结构中对应键值的内容。entry是键值,如“ipaddrpool:start”。val是待设置的新值。设置成功返回0,否则-1。
void iniparser_dumpsection_ini(const dictionary * d, const char * s, FILE * f);
将dictionary中对应组的数据写入一个已打开的文件中。s是组名,f是文件流。
void iniparser_freedict(dictionary * d);
释放dictionary结构
此例程尝试解析文件“/etc/dhcpdconfig.ini”,修改组ipaddrpool的值,然后读取所有数据,最后再写回文件中
#include
#include "iniparser/iniparser.h"
#define INI_PATH "/etc/dhcpdconfig.ini"
int main (int argc, char **argv)
{
FILE *fp = LW_NULL;
dictionary *ini = LW_NULL;
//加载文件
ini = iniparser_load(INI_PATH);
if ( ini == LW_NULL ) {
printf("stone:iniparser_load error!\n");
exit(-1);
}
//设置ipaddrpool
iniparser_set(ini, "ipaddrpool:start", "192.168.1.1");
iniparser_set(ini, "ipaddrpool:end", "192.168.1.100");
//读取数据
printf("%s\n", iniparser_getstring(ini, "ipaddrpool:start", "null"));
printf("%s\n", iniparser_getstring(ini, "ipaddrpool:end", "null"));
printf("%s\n", iniparser_getstring(ini, "filepath:leasefile", "null"));
printf("%s\n", iniparser_getstring(ini, "network:interface", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:dns1", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:dns2", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:subnet", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:router", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:domain", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:lease", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:t1", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:t2", "null"));
//写入文件
fp = fopen(INI_PATH, "w");
if( fp == LW_NULL ) {
printf("stone:fopen error!\n");
exit(-1);
}
iniparser_dumpsection_ini(ini, "ipaddrpool", fp);
iniparser_dumpsection_ini(ini, "filepath", fp);
iniparser_dumpsection_ini(ini, "network", fp);
iniparser_dumpsection_ini(ini, "opt", fp);
fclose(fp);
//释放
iniparser_freedict(ini);
return (0);
}
结果如下: