【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;
}

posted @ 2024-04-18 15:25  梨子Li  阅读(66)  评论(0编辑  收藏  举报