首页 > 编程知识 正文

c语言 ini文件,.ini文件配置

时间:2023-05-05 04:20:17 阅读:208638 作者:1626

目录 iniparser库作用及使用配置文件格式:ini配置文件实例ini文件解析实例 (aliyun_ini.c)iniparser库中的函数

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以及解压缩后目录下的静态axdbbt和动态库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=value0name1=value1[section1]name0=value0name1=value1 ini配置文件实例

这个是我写的ini配置文件实例

[mqtt]host = "a1xIDTDkl.iot-as-mqtt.cn-shanghai.aliyuncs.com"port = 1883topic-pub = /sys/a1DqXTDkl/OGlOu7XgXgItc8UkC/thing/event/property/postusername = OGOu7XgXgItc8UA9C&a1IDqXTklpassworld = 1B8BB1F11F7F05D4D4B842D81A1F81DE035FB7clientid = 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:%sn", buff); str = iniparser_getstring(ini, "mqtt:port", "NULL"); buff = atoi(str); printf("port is:%dn", buff); str = iniparser_getstring(ini, "mqtt:topic-pub", "NULL"); strncpy(buff, str, strlen(str)); printf("topic is:%sn", buff); str = iniparser_getstring(ini, "mqtt:username", "NULL"); strncpy(buff, str, strlen(str)); printf("user is:%sn", buff); str = iniparser_getstring(ini, "mqtt:passworld", "NULL"); strncpy(buff, str, strlen(str)); printf("password is:%sn", buff); str = iniparser_getstring(ini, "mqtt:clientid", "NULL"); strncpy(buff, str, strlen(str)); printf("client_id is:%sn", buff); str = iniparser_getstring(ini, "mqtt:keepalive", "NULL"); buff = atoi(str); printf("keepalive is:%dn", 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文件中看。

```cint 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对象(内存)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。