一、iniparser的概述
INI(Initialization File)文件是一种简单直观的数据存储格式,常用于配置应用程序的初始化设置。这种文件通常包含若干个节(section)和键值对(key-value pairs)。INI文件的每一部分都是自描述性的,易于阅读和编辑,使得非程序员也能轻易理解并修改配置参数。
INI文件因其简单易用性而在许多编程语言中广泛应用,尤其是在Windows操作系统中,很多应用程序都采用INI文件作为配置文件。当然,随着XML、JSON等更丰富、更结构化的数据交换格式的普及,INI文件在现代应用程序中的使用相对减少,但在一些轻量级应用或对启动速度有较高要求的情况下,仍然是一种常见且实用的配置文件格式。
二、为什么要用iniparser
对于很多程序中要用的参数如果是可变的,那么最好的处理方式就是通过main函数参数传递,或者从别的地方去获取,这其中之一就是配置文件,但是在一个成熟和架构完善的系统,一般都会做到自动配置,自动部署,所以有的系统里会有一个单独的配置服务存在,每个其它的服务的配置信息从配置中心服务获取,然后运维人员通过操作界面把配置信息下发给配置中心服务,其余服务从配置中心获取变更信息。
三、下载库
库链接:
https://github.com/ndevilla/iniparser.git
四、常用API介绍
1、加载ini文件
/*
* @brief 从ini格式的配置文件中加载数据
* @param [IN] ininame 要打开的ini格式文件
* @return != NULL 返回一个指向dictionary结构的指针
* == NULL 加载ini文件失败
*/
dictionary * iniparser_load(const char *ininame);
2、获取键值
/*
* @brief 获取指定键(key)对应的字符串类型的值
* @param [IN] d dictionary结构的指针
* @param [IN] key 要查找的键,通常格式为 "section:key",表示要获取哪个节(section)下的哪一项(key)的值。
* @param [IN] def 当键不存在或者其值不是字符串时的默认返回值。如果没有找到对应键,函数将返回此默认值。
* @return 如果找到了相应的键,返回键值对应字符串
* 如果没有找到匹配的键,返回def指定的字符串值
*/
const char * iniparser_getstring(const dictionary *d, const char *key, const char *def);
/*
* @brief 获取指定键(key)对应的整数值
* @param [IN] d dictionary结构的指针
* @param [IN] key 要查找的键,通常格式为 "section:key",表示要获取哪个节(section)下的哪一项(key)的值。
* @param [IN] notfound 当键不存在或者其值不能被转换为整数时,函数将返回这个默认值。
* @return 如果找到了相应的键,并且其值可以被成功转换为整数,则返回该整数值。
* 如果没有找到匹配的键,或者该键对应的值无法转换为整数,则返回 notfound 参数提供的默认值。
*/
int iniparser_getint(const dictionary * d, const char * key, int notfound);
/*
* @brief 获取指定键(key)对应的浮点型值
* @param [IN] d dictionary结构的指针
* @param [IN] key 要查找的键,通常格式为 "section:key",表示要获取哪个节(section)下的哪一项(key)的值。
* @param [IN] notfound 当键不存在或者其值无法转换为双精度浮点数时,函数返回的默认值。
* @return 如果找到了相应的键,并且其值能成功转换为一个双精度浮点数,则返回该浮点数。
* 如果没有找到匹配的键,或者键的值不能被解释为一个有效的双精度浮点数,则返回 notfound 参数所提供的默认值。
*/
double iniparser_getdouble(const dictionary *d, const char *key, double notfound);
3、设置键值
/*
* @brief 设置或修改 ini 配置文件中某个键值对
* @param [IN] d dictionary结构的指针
* @param [IN] entry 字符串形式的键值对标识符,格式通常是 "section:key",表明您要在哪个节(section)下的哪个键(key)上设置或修改值(val)。
* key值存在则修改对应val,key值不存在则会新增
* @param [IN] val: 要设置的新值,作为字符串传递。
* @return 返回0表示设置成功
*/
int iniparser_set(dictionary *ini, const char *entry, const char *val);
4、移除键值
/*
* @brief 移除 ini 配置文件中某个键值对
* @param [IN] d dictionary结构的指针
* @param [IN] entry 字符串形式的键名,包括可选的部分名称(section)和键(key)
* 如果不指定key,则会移除整个section
*/
void iniparser_unset(ini, const char *entry);
5、 判断键是否存在
/*
* @brief 判断 ini 配置文件是否存在某个键值
* @param [IN] d dictionary结构的指针
* @param [IN] entry 字符串形式的键值对标识符,格式通常是 "section:key"
* @return 返回1表示存在,返回0表示不存在
*/
int iniparser_find_entry(const dictionary *ini, const char *entry);
6、获取section个数
/*
* @brief 获取ini配置文件中section的数量
* @param [IN] d dictionary结构的指针
* @return 成功返回section个数,失败返回 -1
*/
int iniparser_getnsec(const dictionary * d);
/*
* @brief 获取某个section值
* @param [IN] d dictionary结构的指针
* @param [IN] n 指定获取第几个section值
* @return 成功返回获取到的section值,失败返回NULL
*/
const char *iniparser_getsecname(const dictionary * d, int n);
7、获取section下key个数
/*
* @brief 获取ini配置文件中某个section的key个数
* @param [IN] d dictionary结构的指针
* @param [IN] s section
* @return 返回指定section下的key个数
*/
int iniparser_getsecnkeys(dictionary * d, char * s);
/*
* @brief 获取ini配置文件中某个section的所有key
* @param [IN] d dictionary结构的指针
* @param [IN] s section
* @param [OUT] keys 通过这个参数输出key,也可以通过返回值获取
* @return 成功返回指定section下的key,失败返回NULL
*/
const char **iniparser_getseckeys(const dictionary *d, const char *s, const char **keys)
8、保存dictionary对象到文件中
/*
* @brief 保存dictionary对象到文件中
* @param [IN] d dictionary结构的指针
* @param [IN] f 已打开的文件描述符
*/
void iniparser_dump_ini(const dictionary *d, FILE *f);
9、释放dictionary对象
/*
* @brief 释放dictionary对象
* @param [IN] d dictionary结构的指针
*/
void iniparser_freedict(dictionary * d);
10、
/*
* @brief 用于向一个已经加载的 INI 配置文件的字典中添加一个条目(键值对)。
* @param [IN] d dictionary结构的指针
* @param [IN] sec 添加或修改的部分(section)的名称。
* @param [IN] key 添加或修改的键名
* @param [IN] val 键设置的值
*/
int iniparser_add_entry(dictionary * d, const char * sec, const char * key, const char * val);