ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【C/C++业务】ini配置文件函数解析库

2020-12-25 22:31:02  阅读:319  来源: 互联网

标签:配置文件 iniparser 注释 源码 C++ key sections 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有