当前位置:   article > 正文

在C++项目中使用YAML对数据进行有序化处理_c++ yaml

c++ yaml

YAML文件作为常用的序列化语言,通常用于数据的保存上。那么我们在c++中如何使用YAML语言呢?这篇博客将集中与c++项目在visual studio上yaml-cpp的安装以及使用YAML语言对数据进行增删查改上。

1、yaml-cpp在visual studio上的安装

我个人用的版本是visual studio 2022,首先在github上获取yaml-cpp项目,链接为

Gitee 极速下载/yaml-cpp

下载后使用cmake对yaml-cpp项目进行编译

  编译器和平台自己电脑上配置的版本,否则会报错。编译结果如下,提示编译成功。

然后我们在使用yaml-cpp时需要对文件路径进行配置

首先,对yaml头文件进行包含,选中yaml文件所在目录

 然后,对项目所需要的静态库文件(使用cmake生成)进行链接。在链接器常规子目录下找到附加库目录,设置为静态库文件所在的目录。

 在链接器输入子目录下找到附加依赖项,输入所需要的静态库文件

最后对动态库进行链接,将动态库文件yaml_cppd.dll文件移动至exe文件下

动态库链接的具体方式可参考:

 最后可实现对yaml文件的操作,测试代码如下:

  1. #include "yaml-cpp/yaml.h"
  2. #include <fstream>
  3. int main()
  4. {
  5. YAML::Node config;
  6. std::ofstream fout("file1.yml"); //< C++ stream 读取文件
  7. config["skills"]["eat"] = 10; //< 修改格式1
  8. config["name"] = "hening"; //< 修改格式2
  9. fout << config;
  10. fout.close();
  11. return 0;
  12. }

2、yaml数据的增删改查实现

yaml数据的数据格式主要分为三种:mapping(对象)、sequence(数组)、scalars(标量)

yaml数据结构参考博客:[C++]-yml库yaml-cpp简介_alwaysrun的博客-CSDN博客_yaml-cpp

yaml数据的增加:

  1. void Add(std::string fileName, YAML::Node config)
  2. {
  3. std::ofstream fout(fileName, std::ios::app);
  4. fout << std::endl << config;
  5. fout.close();
  6. }

yaml数据的修改:

  1. void Change(std::string fileName, YAML::Node config)
  2. {
  3. std::ofstream fout(fileName);
  4. fout << std::endl << config;
  5. fout.close();
  6. }

yaml数据的查询:

初始Node节点默认为map类型,当yaml读取数据时,根据节点的不同进行递归查询。本查询默认结果输出为字符串类型。

  1. void Query(YAML::Node config)
  2. {
  3. //enum value { Undefined, Null, Scalar, Sequence, Map };
  4. switch (config.Type() )
  5. {
  6. case 0:
  7. case 1:
  8. break;
  9. case 2: //scalar
  10. {
  11. std::cout << config.as<std::string>() << std::endl;
  12. break;
  13. }
  14. case 3: //sequence
  15. {
  16. std::cout << std::endl;
  17. for (auto it_1 : config)
  18. {
  19. std::cout << std::setw(3)<<"-";
  20. Query(it_1);
  21. }
  22. break;
  23. }
  24. case 4: //map
  25. {
  26. std::cout << std::endl;
  27. for (auto it_1 : config)
  28. {
  29. std::cout << std::setw(5) << it_1.first.as<std::string>() << ":";
  30. YAML::Node NodeNext = it_1.second;
  31. Query(NodeNext);
  32. }
  33. break;
  34. }
  35. default:
  36. break;
  37. }
  38. }

yaml节点的删除:直接使用remove指令即可

config["skills"].remove("eat");

附上文件全部代码

  1. #include "yaml-cpp/yaml.h"
  2. #include <fstream>
  3. #include <string>
  4. #include <iostream>
  5. #include <iomanip>
  6. void Add(std::string fileName, YAML::Node config)
  7. {
  8. std::ofstream fout(fileName, std::ios::app);
  9. fout << std::endl << config;
  10. fout.close();
  11. }
  12. void Change(std::string fileName, YAML::Node config)
  13. {
  14. std::ofstream fout(fileName);
  15. fout << std::endl << config;
  16. fout.close();
  17. }
  18. void Query(YAML::Node config)
  19. {
  20. //Node是一个类map结构
  21. //enum value { Undefined, Null, Scalar, Sequence, Map };
  22. switch (config.Type() )
  23. {
  24. case 0:
  25. case 1:
  26. break;
  27. case 2: //scalar
  28. {
  29. std::cout << config.as<std::string>() << std::endl;
  30. break;
  31. }
  32. case 3: //sequence
  33. {
  34. std::cout << std::endl;
  35. for (auto it_1 : config)
  36. {
  37. std::cout << std::setw(3)<<"-";
  38. Query(it_1);
  39. }
  40. break;
  41. }
  42. case 4: //map
  43. {
  44. std::cout << std::endl;
  45. for (auto it_1 : config)
  46. {
  47. std::cout << std::setw(5) << it_1.first.as<std::string>() << ":";
  48. YAML::Node NodeNext = it_1.second;
  49. Query(NodeNext);
  50. }
  51. break;
  52. }
  53. default:
  54. break;
  55. }
  56. }
  57. int main()
  58. {
  59. YAML::Node config;
  60. std::string fileName = "file1.yml";
  61. //insert
  62. config["skills"]["eat"] = 10; //< 修改格式1
  63. config["name"] = "hening"; //< 修改格式2
  64. config["hobby"].push_back("football");
  65. config["hobby"].push_back("basketball");
  66. Add(fileName, config);
  67. config.reset();
  68. //change
  69. config = YAML::LoadFile(fileName);
  70. config["blood"] = 15;
  71. Change(fileName, config);
  72. //Query
  73. Query(config);
  74. //Delete
  75. config["skills"].remove("eat");
  76. system("pause");
  77. return 0;
  78. }

将yaml文件与控制台查询结果做对比,可发现两者结果一致。

唯一的缺点是输出时,当node节点为map类型,无法有效区别层次,可添加循环嵌套实现。

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

闽ICP备14008679号