iniparser 库使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/stone8761/article/details/81100747

  iniparser介绍

  iniparser是一个C语言库,是针对INI文件的开源解析器。ini文件则是一些系统或者软件的配置文件。git地址如下:

  https://github.com/ndevilla/iniparser

  ini文件格式

  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。

  注释以分号开头:

  ;地址池

  iniparser基本API

   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 <stdio.h>
#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);
}

 结果如下:

猜你喜欢

转载自blog.csdn.net/stone8761/article/details/81100747