yaml-cpp的实际使⽤注意事项
1、YAML语法
yaml类似于json、xml。是⼀种标记语法。
1.1、YAML语法基本规则try catch的使用方法
(1)关于⼤⼩写:
⼤⼩写敏感
(2)关于层级关系:
使⽤缩进表⽰层级关系,但缩进不允许使⽤tab,只允许空格。
缩进的空格数不重要,只要相同层级的元素左对齐即可
(3)⽀持注释:
注释以'#'开头
1.2、YAML ⽀持的数据类型:
(1)对象:
键值对的集合,⼜称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
(2)数组:
⼀组按次序排列的值,⼜称为序列(sequence) / 列表(list)
(3)纯量(scalars):
单个的、不可再分的值
2、yaml-cpp使⽤
2.1、获取
yaml-cpp是⼀个⽤c++语⾔实现的github上的开源项⽬。可以⾃由的从github上进⾏下载克隆。
该项⽬⽤的管理⼯具是cmake,获取源码后根据源码中的readme进⾏编译(或交叉编译)即可,需要注意的是yaml-cpp是基于c++11开发的,因此要确保编译器⽀持c++11。
具体编译⽅法可以搜百度上有很多指导,这⾥不再赘述。
2.2、写代码
1、头⽂件
只需要包含⼀个头⽂件即可:#include "yaml.h"
2、加载yaml⽂件
try
{
YAML::Node root_node = YAML::LoadFile("test.yaml");
}
catch(const YAML::Exception& e)
{
/
/ TODO:处理异常
}
LoadFile()⽅法再执⾏时,如果出现打开⽂件失败等情况会抛出异常,因此这⾥最好加上try catch。
YAML::Exception是YAML中⾃定义的异常类,该类继承⾃C++中标准的exception。因此,catch中也可以使⽤std::exception类,看个⼈习惯。
3、关于YAML::Node
通过YAML::LoadFile()⽅法,将整个yaml格式的⽂件加载并实例化⼀个YAML::Node类型的对象。
yaml-cpp中YAML::Node是核⼼,他把所有yaml中的对象全部抽象化为YAML::Node类型。
YAML::Node有三种类型:
Scalar
Sequence
Map
YAML::Node类提供了三个⽅法⽤于判断当前Node的类型:IsScalar()、IsSequence()、IsMap()
每实例化出⼀个Node对象之后都要⾸先判断⼀下该Node对象的类型是什么,确定好类型之后再根据不同类型的特点进⾏对该Node对象的值操作。
如果对Node对象进⾏了不符合其类型特点的操作之后,代码会抛出异常。因此,如果Node对象的类型是不确定的情况下进⾏值操作时,⼀定要加上try catch接收异常。
例如:
YAML::Node tmp_node_people = root_node["people"];
if (tmp_node_people.IsMap())
{
//如果确定是Map,那么可以放⼼的使⽤[]操作符
YAML::Node tmp_node_name = tmp_node_people["name"];
}
else if (tmp_node_people.IsScalar())
{
//如果确定是Scalar,可以放⼼的使⽤as⽅法
std::people_name = tmp_node_people.as<std::string>();
//但是需要注意的是,as<>中指定的类型如果是std::string不会有风险,因为⼀切都是字符串,转换没有问题,但是如果指定的是其他值,例如std::int,但实际yaml⽂}
else if (tmp_node_people.IsSequence())
{
//如果确定是Sequence,那么可以放⼼的使⽤[]操作符,当然⾥⾯必须是整数格式的元素下标,否则会抛出异常。
YAML::Node tmp_node_name = tmp_node_people[0];
}
else
{
//TODO:处理未知类型(未知类型是⽆法操作的)
}
Scalar类型的访问:
YAML::Node tmp_node_age = root_node["age"];
int tmp_age = tmp_node_age.as<int>(); //注意:这⾥如果确定此Scalar对象对应的值是int类型的可以直接操作,但如果不确定需要使⽤try catch以防抛出异常。
Map类型的访问:
// Map类型即为键值对,yaml-cpp中将Map类型的节点,使⽤pair类型进⾏遍历
for (YAML::const_iterator it = root_node.begin(); it != d(); ++it)
{
YAML::Node tmp_key_node = it->first;
YAML::Node tmp_value_node = it->second;
key = tmp_key_node.as<std::string>();
value = tmp_value_node<std::string>(); //注意如果这⾥确定value是Scalar类型,是可以这样操作的,如果不确定,⼀定要先通过IsXXX()⽅法确定类型,然后操作。}
Sequence类型的访问:
YAML::Node tmp_node_list = root_node["list"];
for (int i = 0; i < tmp_node.size(); i++)
{
std::string tmp_meta = tmp_node_list[I].as<std::string>(); //注意:这⾥如果确定Sequence中每个元素都是Scalar类型的,可以使⽤as()进⾏访问,否则需要使⽤IsX }
YAML::Exception
YAML::TypedBadConversion  //类型转换错误
YAML::BadFile  //⽂件访问错误
YAML::BadSubscript  //⼦类型错误(例如:Node对象是个Scalar但你确使⽤了[]操作符进⾏访问)...

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。