C语言配置文件解析库——iniparser

最近用MQTT的mosquitto库连接多个云平台(阿里云、华为云、腾讯云),但是它们三个平台的连接配置信息都不一样,所以使用起来很不便。最后了解到有iniparser这个库,最后用一个ini文件就可以配置不同云平台的信息了,而且如果要某云平台的配置信息,我也不用改源码,直接改ini配置文件即可。

一、概述

iniparser是针对ini文件的解析器,可对init文件进行解析、设置、删除等操作。ini文件则是一些系统或软件的配置文件。

下载安装:

git clone https://github.com/ndevilla/iniparser

使用:进入下载的文件src目录下,即可看到四个文件,我们把这四个文件放到自己的对应的目录下即可。
在这里插入图片描述

二、语法

ini文件的最基本单元是key,每个key都有一个名称(name)和对应的值(value),下面是一个key:

name:value

另外,我们可以将不同的key组成一个组,即section。组名要独立一行,并用中括号括起来:

[section]
name:value

一个section的作用域会在下一个section声明的地方结束,如果没有下一个section的声明,那么该section的结束地方就是该文件末尾。如果某个section的某个key对应的值,可用section:key来获取,所以不同的section下可有相同的key名。

iniparser的section和key名称不区分大小写。
注释用分号:

;注释语句

所以如果我们key值里面如果用到分号“;”或者其他符号时,那需要用给key值加双引号,避免出现错误:

[client_id]
id = "a1qMSl93zOd.illumination|securemode=2,signmethod=hmacsha256,timestamp=1651067157548|"

三、API

iniparser.h的API

//获取dictionary对象的section个数
int iniparser_getnsec(dictionary * d); 
 
//获取dictionary对象的第n个section的名字
char * iniparser_getsecname(dictionary * d, int n);

//保存dictionary对象到file
void iniparser_dump_ini(dictionary * d, FILE * f);  

//保存dictionary对象一个section到file
void iniparser_dumpsection_ini(dictionary * d, char * s, FILE * f); 

//保存dictionary对象到file
void iniparser_dump(dictionary * d, FILE * f);  

//获取dictionary对象某个section下的key个数
int iniparser_getsecnkeys(dictionary * d, char * s);    

//获取dictionary对象某个section下所有的key
char ** iniparser_getseckeys(dictionary * d, char * s); 

//返回dictionary对象的section:key对应的字串值
char * iniparser_getstring(dictionary * d, const char * key, char * def);   

//返回idictionary对象的section:key对应的整形值
int iniparser_getint(dictionary * d, const char * key, int notfound);

//返回dictionary对象的section:key对应的双浮点值
double iniparser_getdouble(dictionary * d, const char * key, double notfound);  

//返回dictionary对象的section:key对应的布尔值
int iniparser_getboolean(dictionary * d, const char * key, int notfound);

//设置dictionary对象的某个section:key的值
int iniparser_set(dictionary * ini, const char * entry, const char * val);

//删除dictionary对象中某个section:key
void iniparser_unset(dictionary * ini, const char * entry); 

//判断dictionary对象中是否存在某个section:key
int iniparser_find_entry(dictionary * ini, const char * entry) ;  

 //解析dictionary对象并返回(分配内存)dictionary对象
dictionary * iniparser_load(const char * ininame); 

//释放dictionary对象(内存)
void iniparser_freedict(dictionary * d);    

//计算关键词的hash值
unsigned dictionary_hash(const char * key); 

//创建dictionary对象
dictionary * dictionary_new(int size);  

//删除dictionary对象
void dictionary_del(dictionary * vd);   

//获取dictionary对象的key值
char * dictionary_get(dictionary * d, const char * key, char * def);    

//设置dictionary对象的key值
int dictionary_set(dictionary * vd, const char * key, const char * val);    

//删除dictionary对象的key值
void dictionary_unset(dictionary * d, const char * key);    

//保存dictionary对象
void dictionary_dump(dictionary * d, FILE * out);   

dictionary.h的API

//计算关键词的hash值
unsigned dictionary_hash(const char * key);

//创建dictionary对象
dictionary * dictionary_new(int size);

//删除dictionary对象  
void dictionary_del(dictionary * vd);

//获取dictionary对象的key值   
char * dictionary_get(dictionary * d, const char * key, char * def);

//设置dictionary对象的key值
int dictionary_set(dictionary * vd, const char * key, const char * val);    

//删除dictionary对象的key值    
void dictionary_unset(dictionary * d, const char * key); 

 //保存dictionary对象 
void dictionary_dump(dictionary * d, FILE * out);  

实例

ini文件

//Ali.ini
[mqtt_server_addr]
host = a1qMSl93zOd.iot-as-mqtt.cn-shanghai.aliyuncs.com
port = 1883

[user]
username = illumination&a1qMSl93zOd
passwd = 8dd6cccbb397e70aa42d3dceb2944d24e0874024db5f1b943539dbea0cc06a

[client_id]
id = "a1qMSl93zOd.illumination|securemode=2,signmethod=hmacsha256,timestamp=1651067157548|"

[sub_topic]
topic = /sys/a1qMSl93zOd/illumination/thing/event/property/set

[pub_topic]
topic = /sys/a1qMSl93zOd/illumination/thing/event/property/post

[keepalive]
keepalive = 60

[qos]
qos = 0

C文件

#include <stdio.h>
#include <stdlib.h>
#include "iniparser.h"

int main()
{
    dictionary *ini;

    ini = iniparser_load("./Ali.ini");

    //打印第一个section名
    printf("%s\n", iniparser_getsecname(ini, 0));
    
    //获取整数
    int port = iniparser_getint(ini, "mqtt_server_addr:port", -1);
    printf("port:%d\n", port);

    //某个key的值
    const char *user_name = iniparser_getstring(ini, "client_id:id", "NULL");
    printf("user_name:%s\n", user_name);
	
	//修改ini文件里面某个key的值
    iniparser_set(ini, "mqtt_server_addr:port", "666");

    port = iniparser_getint(ini, "mqtt_server_addr:port", -1);
    printf("port:%d\n", port);

    return 0;

}

运行结果:

mqtt_server_addr
port:1883
user_name:a1qMSl93zOd.illumination|securemode=2,signmethod=hmacsha256,timestamp=1651067157548|
port:666
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值