yaml-cpp YAML格式处理库的介绍和使用(面向业务编程-文件格式处理)
yaml-cpp YAML格式处理库的介绍和使用(面向业务编程-文件格式处理)
YAML格式介绍
YAML的格式介绍,有关ini、json和xml或许很多人已经很了解了,但是关于YAML,还有许多人不了解。YAML被设计成更适合人类阅读(我想正因为如此,所以相对来说更灵活,就导致到使用的时候很多人会觉得它看起来并不严谨)。它的想法类似于Python,去掉了括号和标签,看起来就比较简洁。废话不多说,直接开搞
下面这篇文章有介绍它的一些语法规则
https://zhuanlan.zhihu.com/p/145173920
官网地址:https://yaml.org/
C++关于YAML的库好像找来找去就只有yaml-cpp这个库,并且官网也展示了这个库
yaml-cpp
yaml-cpp是一个C++的YAML解析处理库,符合YAML1.2规范
仓库地址:
https://github.com/jbeder/yaml-cpp
好了,正式开始使用yaml-cpp
以下使用示例均参考自知乎文章https://zhuanlan.zhihu.com/p/96831410
引入头文件
#include "yaml-cpp/yaml.h"
#include <iostream>
声明一个节点
首先,我们声明一个节点
YAML::Node node;
节点声明之后是null类型可以用node.IsNull()判断
键值对
node["key"] = "value";
直接用[]运算符可以像map一样访问
上面这样表示将键key的值设置为value
node["number"] = 255;
也可以赋值为数字,可以用node.IsMap()去查看当前是不是Map类型
Sequence类型(其实就是数组)
node["seq"].push_back("first element");
node["seq"].push_back("second element");
上面代码表示seq是一个数组,数组的内容有first element和second element。
不给名字的Sequence
YAML::Node node2;
node2.push_back("first item");
node2.push_back("second_item");
node2.push_back("third_item");
当不给下标,直接push_back的时候,node2就是一个Sequence类型
插入一个数组
当然除了字符串,也可以插入一个数组
std::vector<int> v = {1,3,5,7,9};
node.push_back(v);
插入的数组即是一个Sequence,Sequence类型可以用node.IsSequence()来判断是不是Sequence
访问Sequence类型
对于Sequence类型可以用下标访问
assert(node2[0].as<std::string>() == "first item");
也可以用迭代器访问
for(auto it = node2.begin();; it != node2.end(); it++)
std::cout << *(it) << std::endl;
将一个节点作为另一个节点的子项
node["node2"] = node2;
给key设置别名,类似于指针
node["pointer_to_first_element"] = node["seq"][0];
// 可以用pointer_to_first_element来访问seq的0号节点
node["pointer_to_first_element"] = "hahaha";
删除一个节点
指定一个node来删除这个节点
node.remove(node["seq"][0]);
也可以指定一个key来删除一个节点,注意这个删除的是指针节点,而非原节点
node.remove("pointer_to_first_element");
怎么读取解析
yaml-cpp可以支持流读取
try {
std::ifstream fin("test.yaml");
YAML::Parser parser(fin);
YAML::Node doc;
parser.GetNextDocument(doc);
// do stuff
} catch(YAML::ParserException& e) {
std::cout << e.what() << "\n";
}
怎么写入到文件
同样使用流的方式写入到文件
std::ofstream file("test.yaml");
file << node <<std::endl;
更多相关操作,或者使用Emitting操作,可以参考官方仓库的docs
https://github.com/jbeder/yaml-cpp/tree/master/docs
以库的形式添加到项目中
本文为作者原创文章,转载请注明出处:https://www.cnblogs.com/nbtech/p/use_yaml-cpp_library.html
yaml-cpp
以库的形式添加到项目中
mkdir UseYaml-cppProject && cd UseYaml-cppProject
git clone https://github.com/jbeder/yaml-cpp.git
vim CMakeLists.txt
CMakeLists.txt文件内容如下
# CMakeLists.txt example,by https://www.cnblogs.com/nbtech/p/use_yaml-cpp_library.html
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(useYaml-cpp LANGUAGES CXX)
# lib yaml-cpp
include_directories(yaml-cpp/include)
add_subdirectory(yaml-cpp lib)
# executable output
add_executable(useYaml-cpp main.cpp)
target_link_libraries(useYaml-cpp yaml-cpp)
CMakeLists.txt文件就不多解释了,add_executable需要加到add_subdirectory的下面
在项目目录再新建一个main.cpp
文件,main.cpp
文件内容如下
#include <iostream>
#include "yaml-cpp/yaml.h"
int main() {
YAML::Node node;
node["number"] = 255;
node["string"] = "sample str";
YAML::Node subNode;
subNode.push_back("element 1");
subNode.push_back("element 2");
node["sub"] = subNode;
std::cout << node << std::endl;
}
写完之后创建目录并编译
mkdir build && cd build
cmake .. && make
编译后生成useYaml-cpp文件,运行后输出结果如下:
number: 255
string: sample str
sub:
- element 1
- element 2
交叉编译?
有时候我们希望它可以跨平台,那么只需要在cmake配置的时候指定交叉编译工具即可
cmake -D CMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ ..