赞
踩
下载后解压
(1)加载ini文件
- // 定义ini文档对象
- CSimpleIniA ini;
-
- // 加载ini文件
- SI_Error rc;
- rc = ini.LoadFile(FILE_NAME); // 另一种方式:SI_Error LoadFile(FILE * a_fpFile);
- if (rc < 0) {
- printf("加载 %s ini 文件失败!\n", FILE_NAME);
- return -1;
- }
rc返回值有以下这些:
- using SI_Error = int;
- constexpr int SI_OK = 0; //!< No error
- constexpr int SI_UPDATED = 1; //!< An existing value was updated
- constexpr int SI_INSERTED = 2; //!< A new value was inserted
-
- // note: test for any error with (retval < 0)
- constexpr int SI_FAIL = -1; //!< Generic failure
- constexpr int SI_NOMEM = -2; //!< Out of memory error
- constexpr int SI_FILE = -3; //!< File error (see errno for detail error)
(2)简单配置
- // 设置INI数据的存储格式,参数为true时保存为UTF-8格式,否则为本地编码格式
- ini.SetUnicode(true);
- // 是否允许一个关键字对应多个值,默认为允许;若不允许,则将最后一个值作为此关键字关联的值
- ini.SetMultiKey(false);
(3)增
①添加一个新的节点(section)
- // 添加一个新的 section
- rc = ini.SetValue("section1", nullptr, nullptr);
- if (rc < 0) {
- printf("添加section1失败!\n");
- return -1;
- }
②添加一个新的 key和value
- // 添加一个新的 key和value
- rc = ini.SetValue("section1", "name", "张三");
- if (rc < 0) {
- printf("添加name失败!\n");
- return -1;
- }
- //const char *name = ini.GetValue("section1", "name", "");
- //printf("name = %s\n", name);
-
- ini.SetValue("section1", "age", "24");
- ini.SetValue("section1", "sex", "男");
注意:
如果name存在,则会将name键(key)对应的值(value)修改为张三;
还可以使用SetLongValue、SetDoubleValue、SetBoolValue去添加:
ini.SetLongValue("server", "length", 173);
ini.SetDoubleValue("server", "weight", 53.5);
ini.SetBoolValue("server", "vip", true);
(4)改
①修改值(value)
- // 修改value,如果键(name)不存在则添加该 key和value
- rc = ini.SetValue("section1", "name", "李四");
- if (rc < 0) {
- printf("修改name失败!\n");
- return -1;
- }
- //const char *name = ini.GetValue("section1", "name");
- //printf("name = %s\n", name);
注意:
如果要修改的值对应的键不存在,则会添加改键和值到section1节点中!
还可以使用SetLongValue、SetDoubleValue、SetBoolValue去添加:
ini.SetLongValue("server", "length", 1000);
ini.SetDoubleValue("server", "weight", 66.66);
ini.SetBoolValue("server", "vip", false);
(5)删
①删除 key 和 value
- // 删除 key
- // 如果最后一个key也被删除了,那么section也会被一起删除掉
- done = ini.Delete("section1", "name");
- if (false == done) {
- printf("删除 section1 - name 失败!\n");
- return -1;
- }
②删除整个节点(section)和其下的所有键(key)
- // 删除整个section和其中的所有键
- done = ini.Delete("section1", nullptr);
- if (false == done) {
- printf("删除整个section和其中的所有键 失败 !\n");
- return -1;
- }
(6)查
①将下图中的ini文件内容读取打印显示
- int _int = std::stoi(ini.GetValue("section", "_int", "-1"));
- printf("_int = %d\n", _int);
- long long _long = std::stoll(ini.GetValue("section", "_long", "-1"));
- printf("_long = %lld\n", _long);
- double _double = std::stod(ini.GetValue("section", "_double", "0.0"));
- printf("_double = %lf\n", _double);
- float _float = std::stof(ini.GetValue("section", "_float", "0.0"));
- printf("_float = %f\n", _float);
- bool _bool = ini.GetBoolValue("section", "_bool", false);
- printf("_bool = %s\n", _bool ? "true" : "false");
- std::string _string = ini.GetValue("section", "_string", "");
- printf("_string = %s\n", _string.c_str());
- std::string _string2 = ini.GetValue("section", "_string2", "");
- printf("_string2 = %s\n", _string2.c_str());
- char _char = ini.GetValue("section", "_char", "")[0];
- printf("_char = %c\n", _char);
- std::string ip = ini.GetValue("server", "ip", "0.0.0.0");
- printf("ip = %s\n", ip.c_str());
- int port = std::stoi(ini.GetValue("server", "port", "-1"));
- printf("port = %d\n", port);
- std::string name1 = ini.GetValue("server", "name", "");
- printf("name = %s\n", name1.c_str());
还可以使用GetLongValue、GetDoubleValue、GetBoolValue去查:
- int lenght = ini.GetLongValue("server", "length", -1);
- double weight = ini.GetDoubleValue("server", "weight", -1);
- bool vip = ini.GetBoolValue("server", "vip", false);
②遍历ini文件的所有内容
GetAllSections:获取所有节点,参数一引用返回list链表;
GetSection:根据参数字符串,获取节点,返回multimap容器;
- CSimpleIniA::TNamesDepend sections;
- // get all sections
- ini.GetAllSections(sections);
- // 遍历所有 section 的 key 和 value
- for (const auto &it : sections) {
- const CSimpleIniA::TKeyVal *pKeyVal = ini.GetSection(it.pItem);
- if (nullptr != pKeyVal) {
- for (const auto& it : *pKeyVal) {
- std::cout << it.first.pItem << " = " << it.second << std::endl;
- }
- }
- }
③遍历所有节点(section)
- CSimpleIniA::TNamesDepend sections1;
- // 获取所有section
- ini.GetAllSections(sections1);
- // 遍历所有 sections
- for (const auto &it : sections1) {
- std::cout << it.pItem << std::endl;
- }
④遍历指定节点的键(key)
GetAllKeys:获取所有键,参数二引用返回list链表;
- CSimpleIniA::TNamesDepend keys;
- // get all keys in a section
- ini.GetAllKeys("section", keys);
- // 遍历 section 指定的所有 key
- for (const auto &it : keys) {
- std::cout << it.pItem << std::endl;
- }
⑤获取一个键对应多个值
首先,ini.SetMultiKey(true)得设置为true,否则只会获取到最后一个值,其他会被删除掉;在ini文件中的server节点添加多几个name键,使用以下代码获取:
- CSimpleIniA::TNamesDepend values;
- // 获取 key 所对应的多个 value;ini.SetMultiKey(true);一定要设置为true,
- // 否则就只会获取到最后一个,其他删除
- ini.GetAllValues("server", "name", values);
- // 遍历一个 key 对应多个 value;
- for (const auto &it : values) {
- printf("name = %s\n", it.pItem);
- }
⑥获取指定节点(section)里有多少键值
- // 获取section里有多少值
- int size = ini.GetSectionSize("section");
- printf("section 的 key 个数:%d\n", size);
(7)保存
注意:以上增、删、改,只有执行保存代码后,才会在文件做出相应的修改!
①保存到文件
- /* 保存到文件中 */
- rc = ini.SaveFile(FILE_NAME);
- if (rc < 0) {
- printf("保存 %s ini文件失败\n", FILE_NAME);
- }
②保存到C++字符串
- std::string strIni = "";
- ini.Save(strIni);
- printf("%s\n", strIni.c_str());
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。