记录学习过程|

梨子Li

园龄:1年9个月粉丝:3关注:0

【iniparser】配置文件

介绍

程序没有任何配置文件,那么它对外是全封闭的,一旦程序需要修改一些参数必须要修改程序代码本身并重新编译,为了让程序出厂后还能根据需要进行必要的配置,所以要用配置文件。

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复制到相应的目录下,编译链接时使用

格式

;section注释
[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 中国大陆许可协议进行许可。

posted @   梨子Li  阅读(125)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起