介绍
程序没有任何配置文件,那么它对外是全封闭的,一旦程序需要修改一些参数必须要修改程序代码本身并重新编译,为了让程序出厂后还能根据需要进行必要的配置,所以要用配置文件。
INI(Initialization)配置文件是一种简单的文本文件,一般用于存储配置信息。INI配置文件经常用于存储项目的全局变量。比如:日志等级、接口地址、输出文件路径、项目地址、用户名、密码等等。INI配置文件一般也只用来存储这些较为简单程序设置,但是同时因为它较为简单的结构,也导致在某些情况下可能不太灵活。INI文件一般配合Iniparser库使用。
下载
下载地址: https://gitcode.com/ndevilla/iniparser.git
| #解压缩 |
| |
| cd iniparser |
| |
| make |
| |
| #将dictionary.c,dictionary.h,iniparser.c,iniparser.h,libiniparser.a,libiniparser.so.1复制到相应的目录下,编译链接时使用 |
格式
| |
| [setion1] |
| key11 = value11 |
| key12 = value12 |
| |
| [setion2] |
| key21 = value21 |
| key22 = value22 |
| ... |
| |
-
ini文件的最基本组成单元就是key或者叫property,每个key都有一个名称(name)和对应的值(value)。
-
多个Key归类为一组,即section。组名定义要独立一行,并用中括号括起来。
-
在section声明下的keys都会和该section关联起来。一个section的作用域会在下一个section声明的地方结束。
-
section不可以嵌套。定位一个key是用section:key来表示的,所以每个组下的key是唯一的不能重复的,但不同组下可以存在相同key。
-
section 和 key 大小写无关,写入的字符串全部小写化,取出的字符串也全部小写化。
-
注释以分号;开头
常用库函数
| dictionary * iniparser_load(const char * ininame); |
| 功能: |
| 加载ini文件,将数据存于dictionary结构中 |
| 参数: |
| const char * ininame:ini文件的名字 |
| 返回值: |
| 成功:dictionary类型的指针 |
| 失败:NULL |
| char * iniparser_getstring(dictionary * d, const char * key, char * def); |
| 功能: |
| 获取对应key的value(iniparser_getint,iniparser_getdouble, iniparser_getboolean 类似) |
| 参数: |
| dictionary * d:ini文件结构体指针 |
| const char * key:要获取的键值,section:key。 |
| char * def:设置的默认值 |
| 返回值: |
| 成功:返回dictionary对象的section:key对应的字串值 |
| 失败:返回def 的内容。 |
| int iniparser_getnsec(dictionary * d); |
| 功能: |
| 获取dictionary对象的section个数 |
| 参数: |
| dictionary * d:dictionary 指针 |
| 返回值: |
| 成功:section的个数 |
| 失败:-1 |
| char * iniparser_getsecname(dictionary * d, int n); |
| 功能: |
| 获取dictionary对象的第n个section的名字 |
| 参数: |
| dictionary * d:dictionary 指针 |
| int n:第n个节 |
| 返回值: |
| 成功:字符串,section的名字 |
| 失败:NULL |
| int iniparser_set(dictionary * d, const char * entry, const char * val); |
| 功能: |
| 设置dictionary对象的某个section:key的值 |
| 参数: |
| dictionary * d:dictionary 指针 |
| const char * entry:要设置的键值,section:key。 |
| const char * val:希望修改成的值 |
| 返回值: |
| 设置成功返回0,否则-1。 |
| void iniparser_unset(dictionary * d, const char * entry); |
| 功能: |
| 删除dictionary对象中某个section:key |
| 参数: |
| dictionary * d:dictionary 指针 |
| const char * entry:要删除的键值,section:key。 |
| void iniparser_dumpsection_ini(dictionary * d, char * s, FILE * f); |
| 功能: |
| dictionary中对应组的数据写入一个已打开的文件中。 |
| 参数: |
| dictionary * d:dictionary 指针 |
| char * s:组名(section) |
| FILE *f:文件流,可以是标准输出或者是一个文件 |
| void iniparser_dump_ini(dictionary * d, FILE * f); |
| 功能: |
| 保存dictionary对象到文件 |
| 参数: |
| dictionary * d:dictionary 指针 |
| FILE * f:文件流,可以是标准输出或者是一个文件 |
| void iniparser_freedict(dictionary * d); |
| 功能: |
| 释放dictionary对象(内存) |
| 参数: |
| dictionary * d:dictionary 指针 |
示例
| [server] |
| hostname = iot-06z00jezfxayfvn.mqtt.iothub.aliyuncs.com |
| port = 1883 |
| |
| [ID] |
| clientId = k11n1ktsKW9.DS18B20|securemode=2,signmethod=hmacsha256,timestamp=1712143691890| |
| |
| [pub_topic] |
| topic = /sys/k11n1ktsKW9/DS18B20/thing/event/property/post |
| |
| [keepalive] |
| keepalive = 60 |
| |
| [qos] |
| qos = 0 |
| #include "iniparser.h" |
| #include "dictionary.h" |
| #include "mqtt_conf.h" |
| #include "logger.h" |
| #include <stdio.h> |
| #include <string.h> |
| |
| typedef struct mqtt_ctx_s |
| { |
| char clientId[BUF_SIZE]; |
| char hostname[BUF_SIZE]; |
| int port; |
| char topic[BUF_SIZE]; |
| int keepalive; |
| int qos; |
| } mqtt_ctx_t; |
| |
| |
| |
| int get_mqtt_conf(char *ini_path, mqtt_ctx_t *mqtt) |
| { |
| dictionary *ini = NULL; |
| |
| const char *clientId; |
| const char *hostname; |
| int port; |
| const char *topic; |
| int keepalive; |
| int qos; |
| |
| if(!ini_path || !mqtt) |
| { |
| printf("invail input parameter in %s\n", __FUNCTION__) ; |
| return -1 ; |
| } |
| |
| ini = iniparser_load(ini_path); |
| if( ini == NULL ) |
| { |
| log_error("iniparser_load() failure\n"); |
| return -1; |
| } |
| |
| clientId = iniparser_getstring(ini, "ID:clientId", DEF_CLIENTID); |
| hostname = iniparser_getstring(ini, "server:hostname", DEF_HOSTNAME); |
| port = iniparser_getint(ini, "server:port", DEF_PORT); |
| topic = iniparser_getstring(ini, "pub_topic:topic", DEF_TOPIC); |
| keepalive = iniparser_getint(ini, "keepalive:keepalive", DEF_KEEPALIVE); |
| qos = iniparser_getint(ini, "qos:qos", DEF_QOS); |
| |
| strncpy(mqtt->clientId, clientId, BUF_SIZE); |
| strncpy(mqtt->hostname, hostname, BUF_SIZE); |
| mqtt->port = port; |
| strncpy(mqtt->topic, topic, BUF_SIZE); |
| mqtt->keepalive = keepalive; |
| mqtt->qos = qos; |
| |
| iniparser_freedict(ini); |
| |
| return 0; |
| } |
| |
本文作者:梨子Li
本文链接:https://www.cnblogs.com/LiBlog--/p/18143604
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步