【C/C++业务】ini配置文件函数解析库
作者:互联网
概述
ini配置文件有三要素parameters,sections和comments
1.parameters
指一条配置,就像key = value这样的。
2.sections
sections是parameters的集合,sections必须独占一行并且用[]括起来。
sections没有明显的结束方式,一个sections的开始就是另一个sections的结束。
3.comments
指INI配置文件的注释,以 ; 开头。
示例
; 注释文字
[port]
Portname=COM4
Port=4
C/C++解析库对比分析
minini
官网:minini
支持C语言以及C++版本,内部有文件锁,支持多线程操作文件,支持带注释读写文件
写文件思路是将写入的数据先生成临时文件然后将临时文件拷贝生成新文件
不错的选择!!!
Iniparser
官网:iniparser
仅支持C语言,源码内部进行了统一格式化,所有字符都会转换成小写字母,并且键值之间距离相同,使得文件相对整齐美观。但是源码不支持带注释写入数据,文件中有注释时写入数据,会将原注释忽略删除,如问题issues97,可修改源码实现保留注释写入。
修改源码思路:将注释视为参数行,在iniparser.c
文件源码中修改iniparser_load
函数添加如下内容
switch (iniparser_line(line, section, key, val)) {
case LINE_EMPTY:
case LINE_COMMENT:
sprintf(tmp, "%s:%s", section, line);
mem_err = dictionary_set(dict, tmp, NULL);
break ;
除此之外,还需将仅有键存在无值时的等号去掉,将iniparser_dumpsection_ini
函数修改如下:
void iniparser_dumpsection_ini(const dictionary * d, const char * s, FILE * f)
{
int j ;
char keym[ASCIILINESZ+1];
int seclen ;
if (d==NULL || f==NULL) return ;
if (! iniparser_find_entry(d, s)) return ;
seclen = (int)strlen(s);
fprintf(f, "\n[%s]\n", s);
sprintf(keym, "%s:", s);
for (j=0 ; j<d->size ; j++) {
if (d->key[j]==NULL)
continue ;
if (!strncmp(d->key[j], keym, seclen+1)) {
if(d->val[j])
fprintf(f, "%-30s = %s\n", d->key[j]+seclen+1, d->val[j]);
else
fprintf(f, "%-30s\n", d->key[j]+seclen+1);
}
}
fprintf(f, "\n");
return ;
}
至此,便可简单实现保留注释写入修改参数
源码中关键之处应该理解dictionary_set
函数中hash = dictionary_hash(key) ;
是将键的内存地址经过哈希计算后得到一个哈希值,根据此值再去判断是否添加键值和段,由于栈内存不会复用,因此不会出现重复的哈希值。
基于此源码修改的版本:iniparser plus
inih
源码:inih
支持C和C++,但是只能读取写数据,不能写入修改数据,不好用。
inifile2
源码: inifile2
C++编写实现,一个轻量级的inifile文件解析库,支持解析ini文件,支持修改、保存ini文件,支持设置多个注释符,默认为“#”和’;’,支持参数名重复,使用gtest和valgrind做过测试
simpleini
源码: simpleini
C++编写实现,不支持C语言,使用简单方便,相对不错。C++相对选择就更多了,不像C语言局限,不再进行详述。
更多详情参见:inifile wiki
标签:配置文件,iniparser,注释,源码,C++,key,sections,ini 来源: https://blog.csdn.net/weixin_43166958/article/details/111706879