揭阳市住房和城乡建设局官方网站,做网站空间需要多大,商务网站教程,网络黄页进入有限公司1 ini文件介绍
INI#xff08;Initialization File#xff09;文件是一种简单直观的数据存储格式#xff0c;常用于配置应用程序的初始化设置。这种文件通常包含若干个节#xff08;section#xff09;和键值对#xff08;key-value pairs#xff09;。INI文件的每一部…1 ini文件介绍
INIInitialization File文件是一种简单直观的数据存储格式常用于配置应用程序的初始化设置。这种文件通常包含若干个节section和键值对key-value pairs。INI文件的每一部分都是自描述性的易于阅读和编辑使得非程序员也能轻易理解并修改配置参数。INI文件因其简单易用性而在许多编程语言中广泛应用尤其是在Windows操作系统中很多应用程序都采用INI文件作为配置文件。当然随着XML、JSON等更丰富、更结构化的数据交换格式的普及INI文件在现代应用程序中的使用相对减少但在一些轻量级应用或对启动速度有较高要求的情况下仍然是一种常见且实用的配置文件格式。
2 ini文件结构
节SectionINI文件中的各个部分通过方括号 [] 包裹的名称来定义例如 [Section1]。每个节可以包含多个键值对。键值对Key-Value Pairs键和值之间用等号 分隔如 key1value1。键通常是描述性质的字符串而值则可以是字符串、数字或其他类型的数据。注释注释行以分号 ; 开始直到行尾都被视为注释内容不会被程序解析。多行值某些INI解析器允许值跨越多行通常通过在行尾添加反斜杠 \ 来延续到下一行
iniparser
iniparser 是一个开源的 C 语言库用于解析和操作 INI 格式的配置文件使用 iniparser 库的应用程序可以很方便地读取和解析INI文件中的配置信息大大简化了对配置文件的处理工作降低了程序的开发复杂度。由于其开源属性开发者可以根据自己的需求自由使用、研究和改进该库。
3 相关API
3.1 加载ini文件 /** brief 从ini格式的配置文件中加载数据* param [IN] ininame 要打开的ini格式文件 * return ! NULL 返回一个指向dictionary结构的指针* NULL 加载ini文件失败*/dictionary * iniparser_load(const char *ininame);3.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.3 设置键值 /** brief 设置或修改 ini 配置文件中某个键值对* param [IN] d dictionary结构的指针 * param [IN] entry 字符串形式的键值对标识符格式通常是 section:key表明您要在哪个节(section)下的哪个键(key)上设置或修改值(val)。* key值存在则修改对应valkey值不存在则会新增* param [IN] val: 要设置的新值作为字符串传递。* return 返回0表示设置成功*/int iniparser_set(dictionary *ini, const char *entry, const char *val);3.4 移除键值 /** brief 移除 ini 配置文件中某个键值对* param [IN] d dictionary结构的指针 * param [IN] entry 字符串形式的键名包括可选的部分名称section和键key* 如果不指定key则会移除整个section*/void iniparser_unset(ini, const char *entry);3.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);3.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);3.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)3.8 保存dictionary对象到文件中 /** brief 保存dictionary对象到文件中* param [IN] d dictionary结构的指针 * param [IN] f 已打开的文件描述符*/void iniparser_dump_ini(const dictionary *d, FILE *f);3.9 释放dictionary对象 /** brief 释放dictionary对象* param [IN] d dictionary结构的指针 */void iniparser_freedict(dictionary * d);4 演示
4.1 获取键值
ini文件内容 [head]accecpt */*length 100host 192.168.1.2port 8087rate 9.98[body]accept XMLdata jsonlength 200测试代码 #include stdio.h#include iniparser.hint main(){// 加载配置dictionary* ini iniparser_load(config.ini);if(ini NULL){return -1;}// 获取键值const char* cHeadHost iniparser_getstring(ini, head:host, 127.0.0.1);printf(cHeadHost %s\n, cHeadHost);const char* cBodyData iniparser_getstring(ini, body:data, welcome);printf(cBodyData %s\n, cBodyData);int iHeadPort iniparser_getint(ini, head:port, 80);printf(iHeadPort %d\n, iHeadPort);double iHeadReate iniparser_getdouble(ini, head:rate, 9.99);printf(iHeadReate %.2lf\n, iHeadReate);// 释放dictionary对象iniparser_freedict(ini);return 0;}打印结果
4.2 设置键值
ini文件内容 [head]accecpt */*length 100host 192.168.1.2port 8087rate 9.98[body]accept XMLdata jsonlength 200测试代码 #include stdio.h#include iniparser.hint main(){// 加载配置dictionary* ini iniparser_load(config.ini);if(ini NULL){return -1;}// 有对应键值则修改int ret iniparser_set(ini, body:data, iniparser);if (ret ! 0){printf(iniparser_set body:data failed.\n);}// 没有对应键值则添加ret iniparser_set(ini, body:msg, success);if (ret ! 0){printf(iniparser_set body:data failed.\n);}// 设置值成功后要进行保存FILE* fp fopen(config.ini, w);if( fp NULL ) {printf(open ini file failed.\n);return -1;}// 保存dictionary对象到file iniparser_dump_ini(ini, fp);fclose(fp);// 释放dictionary对象iniparser_freedict(ini);return 0;}设置后新的ini文件内容 [head]accecpt */*length 100host 192.168.1.2port 8087rate 9.98[body]accept XMLdata iniparserlength 200msg success4.3 遍历section和键值
ini文件内容 [head]accecpt */*length 100host 192.168.1.2port 8087rate 9.98[body]accept XMLdata iniparserlength 200msg success测试代码 #include stdio.h#include iniparser.hint main(){// 加载配置dictionary* ini iniparser_load(config.ini);if(ini NULL){return -1;}// 遍历sectionint sectionNum iniparser_getnsec(ini);if(sectionNum ! -1){for(int i 0; i sectionNum; i){const char* cSection iniparser_getsecname(ini, i); if(cSection ! 0){printf(cSection : %s\n, cSection);}}}// 遍历某个section下的keyint keyNum iniparser_getsecnkeys(ini, body);//获取dictionary对象某个section下所有的key char keys[10][1024] { 0 };const char **p (const char **)keys;const char **retKeys iniparser_getseckeys(ini, body, p); for (int i 0; i keyNum; i){printf(%s , p[i]);}printf(\n);// 释放dictionary对象iniparser_freedict(ini);return 0;}打印结果