ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

30分钟学会Yaml-cpp 0.6.0

2019-12-11 23:02:15  阅读:206  来源: 互联网

标签:node yaml 30 0.6 Yaml test key cpp first


目前在中文互联网上有一些关于yaml-cpp,一个cpp的yaml工具的介绍和例子。不过他们都是基于old API的,这里就介绍一下新的API(yaml-cpp>0.6.0)的使用方法。

你可以在这里找到yaml-cpp的库,安装和tutorial在上面都有。本文主要是提供一个快速的中文的上手教学。

yaml-cpp的编译和安装

这里介绍yaml-cpp的安装。由于博主在Ubuntu环境下使用yaml-cpp,因此这里针对Ubuntu环境介绍安装方法。
1.首先克隆仓库
git clone https://github.com/jbeder/yaml-cpp.git

注意克隆下来的版本,这里是新版本的教程,因此版本应该大等于0.6.0。

2.编译并安装yaml-cpp
进入仓库目录
cd yaml-cpp
进行编译
mkdir build && cd build
cmake .. && make
这里按照github主页上的教程,可以设置一些不同的开关,但是作者也说:

...On a UNIX-y system, simply omit the option to generate a makefile.

当然,Ubuntu属于这类情况。

编译成功之后,可以运行一下test测试代码:
make test
理论上这里不应该报错。最后,如果你想要将yaml-cpp加入到全局路径,你应该:
sudo make install
这样,你就无需指定yaml-cpp的路径,yaml-cpp编译出来的头文件和lib会被安装到/usr指定位置。你也可以不执行这个操作,这样你需要在CMakeList中手动指定头文件和include路径。

node的增改查删

Node是yaml-cpp中最重要的数据结构。Node一共有以下几种type:

  • Null 空节点
  • Sequence 序列,类似于一个Vector,对应YAML格式中的数组
  • Map 类似标准库中的Map,对应YAML格式中的对象
  • Scalar 标量,对应YAML格式中的常量

以下直接上代码,详细的情况请看注释。

#include <fstream>
#include <yaml-cpp/yaml.h>
#include <iostream>
#include <assert.h>

int main()
{
    YAML::Node node;  
    assert(node.IsNull());  //初始化的节点是Null类型
    node["key"] = "value";  //当你给它赋值键值对,它转变为Map类型
    //node.force_insert("key", "value");//这个操作和上面等价,但是它不会检查是否存在"key"键,不推荐使用
    if(node["mascot"])
        std::cout << node["mascot"].as<std::string>() << "\n";//单纯的查询操作不会增加一个key,当然上面的if不会执行

    node["number"] = 255;
    assert(node.IsMap());   //node是一个Map
    node["seq"].push_back("first element");
    node["seq"].push_back("second element");//node的seq下是Sequence类型,有两个参数

    YAML::Node node_2;  
    node_2.push_back("first item");//如果你不给node_2键值对,它是一个sequence类型
    node_2.push_back("second_item");
    node_2.push_back("third_item");
    std::vector<int> v = {1,3,5,7,9};//给node_2插入了一个Sequence
    node_2.push_back(v);
    assert(node_2.IsSequence());//当然,node_2仍然是一个Sequence

    assert(node_2[0].as<std::string>() == "first item");
    //对于Sequence类型,你可以使用它的下标来访问
    //注意这里as<T>是一个模板转换,node_2[0]的type是NodeType::Scalar
    auto it = node_2.begin();
    for(; it != node_2.end(); it++)
        std::cout << *(it) << std::endl;
    //当然,你也可以用迭代器来访问
    //他们的类型分别是NodeType::Scalar,NodeType::Scalar,NodeType::Scalar,NodeType::Sequence
    //取值时记得使用as进行模板转换
    node_2["key"] = "value";
    assert(node_2.IsMap());//一旦node_2接收到键值对,它转变为Map类型
    assert(node_2[0].as<std::string>() == "first item");//此时,Sequence时的下标变为它的key值
    node["node_2"] = node_2;//将node_2作为node的一个子项
    node["pointer_to_first_element"] = node["seq"][0];//你也可以给已有的node设置一个别名,类似于一个指针
    assert(node["pointer_to_first_element"].as<std::string>() == "first element");//你可以通过这个指针访问那个node

    node.remove(node["seq"][0]);//你可以通过指定一个node来删除它
    node.remove("pointer_to_first_element");//你也可以通过指定key来删除它
}

如果你执行std::cout << node << endl;应该会得到以下结果:

key: value
number: 255
seq:
  - first element
  - second element
node_2:
  0: first item
  1: second_item
  2: third_item
  3:
    - 1
    - 3
    - 5
    - 7
    - 9
  key: value

至此,Node的增改查删操作基本介绍完毕。

yaml文件的保存与读取

Node可以使用文件流的方式进行读写,上面的std::cout已经证明了这一点。你可以这样保存一个node:

std::ofstream file("test.yaml");
file << node <<std::endl;

这样,上面打印到cout的内容会被输出到test.yaml文件。
为了读取一个node,你可以这么做:

std::ifstream file("test.yaml");
YAML::Node node = YAML::Load(file);//读取来自test.yaml的node文件
std::cout << node <<std::endl;

YAML::Node node_2 = YAML::LoadFile("test.yaml");//也可以这样读取文件
std::cout << node_2["node_2"] <<std::endl;//可以直接用下标访问
for(auto it = node_2.begin(); it != node_2.end(); it++)
    std::cout << it->first << it->second << std::endl;//也可以用迭代器访问

CMakeList

编写完源文件以后,在CMakeList中添加如下内容使得程序能够编译:

find_package(yaml-cpp REQUIRED)#找到package
add_executable(yaml-test src/yaml-test.cpp)
target_link_libraries(yaml-test yaml-cpp
)#添加链接库

之后就可以使用cmake编译程序了。

标签:node,yaml,30,0.6,Yaml,test,key,cpp,first
来源: https://www.cnblogs.com/huodaozhe/p/12026327.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有