• 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 
    

    声明一个节点

    首先,我们声明一个节点

    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 v = {1,3,5,7,9};
    node.push_back(v);
    

    插入的数组即是一个Sequence,Sequence类型可以用node.IsSequence()来判断是不是Sequence

    访问Sequence类型

    对于Sequence类型可以用下标访问

    assert(node2[0].as() == "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 
    #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++ ..
    

    __EOF__

  • 本文作者: Kevin
  • 本文链接: https://www.cnblogs.com/nbtech/p/use_yaml-cpp_library.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    函数模板和类模板实例介绍
    致敬最美逆行者网页设计作品 大学生抗疫感动专题网页设计作业模板 疫情感动人物静态HTML网页模板下载
    第4讲引入JWT前后端交互
    华为笔记本MateBook D 14 2021款锐龙版R7集显非触屏(NbM-WFP9)原装出厂Windows10-20H2系统
    归并排序及其拓展应用
    三维GIS可视化技术在城市管理中的作用
    RabbitMQ如何保证可靠
    状态管理的艺术:探索Flutter的Provider库
    Windows11 上使用 QEMU 创建 Ubuntu aarch64(ARM64)虚拟机
    js中es6*扩展运算符的用法
  • 原文地址:https://www.cnblogs.com/nbtech/p/use_yaml-cpp_library.html