当前位置:   article > 正文

simpleini开源库使用_c++ keyval 数据库开源

c++ keyval 数据库开源

源码下载:GitHub - brofield/simpleini: Cross-platform C++ library providing a simple API to read and write INI-style configuration files

1.加载simpleini库

下载后解压

2.simpleini库的简单使用

(1)加载ini文件

  1. // 定义ini文档对象
  2. CSimpleIniA ini;
  3. // 加载ini文件
  4. SI_Error rc;
  5. rc = ini.LoadFile(FILE_NAME); // 另一种方式:SI_Error LoadFile(FILE * a_fpFile);
  6. if (rc < 0) {
  7. printf("加载 %s ini 文件失败!\n", FILE_NAME);
  8. return -1;
  9. }

rc返回值有以下这些:

  1. using SI_Error = int;
  2. constexpr int SI_OK = 0; //!< No error
  3. constexpr int SI_UPDATED = 1; //!< An existing value was updated
  4. constexpr int SI_INSERTED = 2; //!< A new value was inserted
  5. // note: test for any error with (retval < 0)
  6. constexpr int SI_FAIL = -1; //!< Generic failure
  7. constexpr int SI_NOMEM = -2; //!< Out of memory error
  8. constexpr int SI_FILE = -3; //!< File error (see errno for detail error)

(2)简单配置

  1. // 设置INI数据的存储格式,参数为true时保存为UTF-8格式,否则为本地编码格式
  2. ini.SetUnicode(true);
  3. // 是否允许一个关键字对应多个值,默认为允许;若不允许,则将最后一个值作为此关键字关联的值
  4. ini.SetMultiKey(false);

(3)增

①添加一个新的节点(section)

  1. // 添加一个新的 section
  2. rc = ini.SetValue("section1", nullptr, nullptr);
  3. if (rc < 0) {
  4. printf("添加section1失败!\n");
  5. return -1;
  6. }

②添加一个新的 key和value

  1. // 添加一个新的 key和value
  2. rc = ini.SetValue("section1", "name", "张三");
  3. if (rc < 0) {
  4. printf("添加name失败!\n");
  5. return -1;
  6. }
  7. //const char *name = ini.GetValue("section1", "name", "");
  8. //printf("name = %s\n", name);
  9. ini.SetValue("section1", "age", "24");
  10. 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)

  1. // 修改value,如果键(name)不存在则添加该 key和value
  2. rc = ini.SetValue("section1", "name", "李四");
  3. if (rc < 0) {
  4. printf("修改name失败!\n");
  5. return -1;
  6. }
  7. //const char *name = ini.GetValue("section1", "name");
  8. //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

  1. // 删除 key
  2. // 如果最后一个key也被删除了,那么section也会被一起删除掉
  3. done = ini.Delete("section1", "name");
  4. if (false == done) {
  5. printf("删除 section1 - name 失败!\n");
  6. return -1;
  7. }

②删除整个节点(section)和其下的所有键(key)

  1. // 删除整个section和其中的所有键
  2. done = ini.Delete("section1", nullptr);
  3. if (false == done) {
  4. printf("删除整个section和其中的所有键 失败 !\n");
  5. return -1;
  6. }

(6)查

①将下图中的ini文件内容读取打印显示

  1. int _int = std::stoi(ini.GetValue("section", "_int", "-1"));
  2. printf("_int = %d\n", _int);
  3. long long _long = std::stoll(ini.GetValue("section", "_long", "-1"));
  4. printf("_long = %lld\n", _long);
  5. double _double = std::stod(ini.GetValue("section", "_double", "0.0"));
  6. printf("_double = %lf\n", _double);
  7. float _float = std::stof(ini.GetValue("section", "_float", "0.0"));
  8. printf("_float = %f\n", _float);
  9. bool _bool = ini.GetBoolValue("section", "_bool", false);
  10. printf("_bool = %s\n", _bool ? "true" : "false");
  11. std::string _string = ini.GetValue("section", "_string", "");
  12. printf("_string = %s\n", _string.c_str());
  13. std::string _string2 = ini.GetValue("section", "_string2", "");
  14. printf("_string2 = %s\n", _string2.c_str());
  15. char _char = ini.GetValue("section", "_char", "")[0];
  16. printf("_char = %c\n", _char);
  17. std::string ip = ini.GetValue("server", "ip", "0.0.0.0");
  18. printf("ip = %s\n", ip.c_str());
  19. int port = std::stoi(ini.GetValue("server", "port", "-1"));
  20. printf("port = %d\n", port);
  21. std::string name1 = ini.GetValue("server", "name", "");
  22. printf("name = %s\n", name1.c_str());

还可以使用GetLongValue、GetDoubleValue、GetBoolValue去查:

  1. int lenght = ini.GetLongValue("server", "length", -1);
  2. double weight = ini.GetDoubleValue("server", "weight", -1);
  3. bool vip = ini.GetBoolValue("server", "vip", false);

②遍历ini文件的所有内容

GetAllSections:获取所有节点,参数一引用返回list链表;

GetSection:根据参数字符串,获取节点,返回multimap容器;

  1. CSimpleIniA::TNamesDepend sections;
  2. // get all sections
  3. ini.GetAllSections(sections);
  4. // 遍历所有 section 的 key 和 value
  5. for (const auto &it : sections) {
  6. const CSimpleIniA::TKeyVal *pKeyVal = ini.GetSection(it.pItem);
  7. if (nullptr != pKeyVal) {
  8. for (const auto& it : *pKeyVal) {
  9. std::cout << it.first.pItem << " = " << it.second << std::endl;
  10. }
  11. }
  12. }

③遍历所有节点(section)

  1. CSimpleIniA::TNamesDepend sections1;
  2. // 获取所有section
  3. ini.GetAllSections(sections1);
  4. // 遍历所有 sections
  5. for (const auto &it : sections1) {
  6. std::cout << it.pItem << std::endl;
  7. }

④遍历指定节点的键(key)

GetAllKeys:获取所有键,参数二引用返回list链表;

  1. CSimpleIniA::TNamesDepend keys;
  2. // get all keys in a section
  3. ini.GetAllKeys("section", keys);
  4. // 遍历 section 指定的所有 key
  5. for (const auto &it : keys) {
  6. std::cout << it.pItem << std::endl;
  7. }

⑤获取一个键对应多个值

首先,ini.SetMultiKey(true)得设置为true,否则只会获取到最后一个值,其他会被删除掉;在ini文件中的server节点添加多几个name键,使用以下代码获取:

  1. CSimpleIniA::TNamesDepend values;
  2. // 获取 key 所对应的多个 value;ini.SetMultiKey(true);一定要设置为true,
  3. // 否则就只会获取到最后一个,其他删除
  4. ini.GetAllValues("server", "name", values);
  5. // 遍历一个 key 对应多个 value;
  6. for (const auto &it : values) {
  7. printf("name = %s\n", it.pItem);
  8. }

⑥获取指定节点(section)里有多少键值

  1. // 获取section里有多少值
  2. int size = ini.GetSectionSize("section");
  3. printf("section 的 key 个数:%d\n", size);

(7)保存

注意:以上增、删、改,只有执行保存代码后,才会在文件做出相应的修改!

①保存到文件

  1. /* 保存到文件中 */
  2. rc = ini.SaveFile(FILE_NAME);
  3. if (rc < 0) {
  4. printf("保存 %s ini文件失败\n", FILE_NAME);
  5. }

②保存到C++字符串

  1. std::string strIni = "";
  2. ini.Save(strIni);
  3. printf("%s\n", strIni.c_str());

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/168911?site
推荐阅读
相关标签
  

闽ICP备14008679号