iniparser库作用及使用
我们在Linux中做项目的时候一般都要用到配置文件,这样在源码中修改一些比如参数的时候我们就不用打开代码修改然后再重新编译,我们可以之间修改配置文件就行,我们项目发布出去之后用户也可以在看不到源码的情况下自己修改一些参数。
我写的配置文件主要是保存连接上阿里云所需要的认证信息,然后解析的话用的是iniparser库,这个库是C语言ini形式配置文件解析库,
这个库去官网下载或者gihub下载都很慢或者打不开网站,可以之间去我的网盘下载
链接:https://pan.baidu.com/s/1doipKvkthqOOia00dWaOtQ
提取码:62fb
下载之后解压tar -zxvf iniparser-3.1.tar.gz ,然后进去make,make完之后,src下的头文件dictionary.h和iniparser.h以及解压缩后目录下的静态库libiniparser.a和动态库libiniparser.so.1是我们做配置文件解析时要用到的
这里我只做用到inipaser.h头文件和libiniparser.so.a动态库,当然想要使用链接静态库的也可以用libiniparser.a。
配置文件格式:
INI文件由节[section]、键(name)、值(value)组成。
注解使用分号表示(;)。在分号后面的文字,直到该行结尾都全部为注解。
NI文件的格式很简单,最基本的三个要素是:parameters,sections和comments。
INI所包含的最基本的“元素”就是parameter;每一个parameter都有一个name和一个value,name和value是由等号“=”隔开。name在等号的左边。
如:
name = value
所有的parameters都是以sections为单位结合在一起的。所有的section名称都是独占一行,并且sections名字都被方括号包围着([ and ])。在section声明后的所有parameters都是属于该section。
对于一个section没有明显的结束标志符,一个section的开始就是上一个section的结束,或者是end of the file。Sections一般情况下不能被nested,当然特殊情况下也可以实现sections的嵌套。
comments就是注释,在INI文件中注释语句是以分号“;”开始的。所有的所有的注释语句不管多长都是独占一行直到结束的。在分号和行结束符之间的所有内容都是被忽略的。
ini配置文件格式如下所示
[section0]
name0=value0
name1=value1
[section1]
name0=value0
name1=value1
ini配置文件实例
这个是我写的ini配置文件实例
[mqtt]
host = "a1xIDTDkl.iot-as-mqtt.cn-shanghai.aliyuncs.com"
port = 1883
topic-pub = /sys/a1DqXTDkl/OGlOu7XgXgItc8UkC/thing/event/property/post
username = OGOu7XgXgItc8UA9C&a1IDqXTkl
passworld = 1B8BB1F11F7F05D4D4B842D81A1F81DE035FB7
clientid = hhh|securemode=3,signmethod=hmacsha1,timestamp=60|
keepalive = 60
ini文件解析实例 (aliyun_ini.c)
/********************************************************************************** Copyright: (C) 2021 li liangshi<1007146932@qq.com>
* All rights reserved.
*
* Filename: test.c
* Description: This file
*
* Version: 1.0.0(2021年08月07日)
* Author: li liangshi <1007146932@qq.com>
* ChangeLog: 1, Release initial version on "2021年08月07日 22时04分39秒"
*
********************************************************************************/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <iniparser.h>
#define INI_PATH "/home/lls/MQTT/src/ini_test/aliyunmqtt.ini"
int main()
{
dictionary *ini = NULL;
const char *str;
char buff[1024];
//加载ini文件,将数据存于ini结构中
ini = iniparser_load(INI_PATH);
if( ini == NULL )
{
return;
}
// 获取对应key的value。key以组+key的形式体现,如“mqtt:host”,这里mqtt就是组,“host:value”就是key,返回值是value,若未找到对应的key则返回NULL。
str = iniparser_getstring(ini, "mqtt:host", "NULL");
strncpy(buff, str, strlen(str));
printf("host is:%s\n", buff);
str = iniparser_getstring(ini, "mqtt:port", "NULL");
buff = atoi(str);
printf("port is:%d\n", buff);
str = iniparser_getstring(ini, "mqtt:topic-pub", "NULL");
strncpy(buff, str, strlen(str));
printf("topic is:%s\n", buff);
str = iniparser_getstring(ini, "mqtt:username", "NULL");
strncpy(buff, str, strlen(str));
printf("user is:%s\n", buff);
str = iniparser_getstring(ini, "mqtt:passworld", "NULL");
strncpy(buff, str, strlen(str));
printf("password is:%s\n", buff);
str = iniparser_getstring(ini, "mqtt:clientid", "NULL");
strncpy(buff, str, strlen(str));
printf("client_id is:%s\n", buff);
str = iniparser_getstring(ini, "mqtt:keepalive", "NULL");
buff = atoi(str);
printf("keepalive is:%d\n", buff);
//释放dictionary结构
iniparser_freedict(ini);
return mosquitto;
return 0;
}
把inipaser.h头文件和libiniparser.so.a动态库放到跟aliyun_ini.c文件同一目录下,编译命令如下
gcc aliyun_ini.c -o aliyun_int -liniparser
iniparser库中的函数
想要了解具体实现可以去iniparser.c文件中看。
```c
int iniparser_getnsec(dictionary * d); //获取dictionary对象的section个数
char * iniparser_getsecname(dictionary * d, int n); //获取dictionary对象的第n个section的名字
void iniparser_dump_ini(dictionary * d, FILE * f); //保存dictionary对象到file
void iniparser_dumpsection_ini(dictionary * d, char * s, FILE * f); //保存dictionary对象一个section到file
void iniparser_dump(dictionary * d, FILE * f); //保存dictionary对象到file
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); //返回dictionary对象的section:key对应的字串值
int iniparser_getint(dictionary * d, const char * key, int notfound); //返回idictionary对象的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对象中是否存在某个section:key
dictionary * iniparser_load(const char * ininame); //解析dictionary对象并返回(分配内存)dictionary对象
void iniparser_freedict(dictionary * d); //释放dictionary对象(内存)