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++ ..

yaml-cpp YAML格式处理库的介绍和使用(面向业务编程-文件格式处理)的更多相关文章

  1. 前端常用的库和实用技术之JavaScript面向切面编程

    Aspect Oriented Programming(AOP)面向切面编程是一个比较热门的话题. AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程 中的某个步骤或阶段,以 ...

  2. Python基础笔记1-Python读写yaml文件(使用PyYAML库)

    最近在搭建自动化测试项目过程中经常遇到yaml文件的读写,为了方便后续使用,决定记下笔记. 一,YAML 简介 YAML,Yet Another Markup Language的简写,通常用来编写项目 ...

  3. k8s之yaml文件书写格式

    k8s之yaml文件书写格式 1 # yaml格式的pod定义文件完整内容: 2 apiVersion: v1 #必选,版本号,例如v1 3 kind: Pod #必选,Pod 4 metadata: ...

  4. 相同内容 yaml 与 json 格式对比

    关联数组: yaml person: name: 张三 age: 24 json { "person": { "name": "张三", . ...

  5. Python常用的库简单介绍一下

    Python常用的库简单介绍一下fuzzywuzzy ,字符串模糊匹配. esmre ,正则表达式的加速器. colorama 主要用来给文本添加各种颜色,并且非常简单易用. Prettytable ...

  6. STL学习系列之一——标准模板库STL介绍

    库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...

  7. 【Yaml】Yaml学习笔记

    转载:https://blog.csdn.net/moshenglv/article/details/52084899 YAML何许物也?在XML泛滥的情况下,YAML的出现的确让人眼前一亮,在初步学 ...

  8. OpenCV库文件介绍

    以前都是直接用opencv,都没有仔细研究过,这次把库文件都介绍一下. 1.build和source 当我们安装完opencv中,你会发现在opencv文件夹中有两个文件夹,build和source, ...

  9. professional cuda c programming--CUDA库简单介绍

    CUDA Libraries简单介绍   上图是CUDA 库的位置.本文简要介绍cuSPARSE.cuBLAS.cuFFT和cuRAND.之后会介绍OpenACC. cuSPARSE线性代数库,主要针 ...

  10. Python基础笔记2-ruamel.yaml读写yaml文件

    上一篇笔记记录了Python中的pyyaml库对yaml文件进行读写,但了解到ruamel.yaml也能对yaml文件进行读写,于是想尝试一下它的用法. 一,注意 这里首先要更正一下网上大部分博客的说 ...

随机推荐

  1. scala的运算符

    1.算数运算符 与java基本一样,只有个别细节不一样 (1).除法的区别:整数/整数 结果为整数(小数部分直接舍掉了):小数/整数 结果为小数: 例如:val result = 10.0 / 3 p ...

  2. Flutter showModalBottomSheet 自适应高度

    showModalBottomSheet( context: context, shape: const RoundedRectangleBorder( borderRadius: BorderRad ...

  3. Topsis法的python实现

    TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution )法是C.L.Hwang和K.Yoon于1981年首 ...

  4. Java中double保留2位小数(精度丢失)的两种方式

    Java中double保留2位小数(精度丢失)的两种方式 在我们日常开发中,使用double数据类型进行计算,偶尔会出现精度丢失的情况,例如实际结果是0.75,就可能出现0.7500000000000 ...

  5. software engineering homework 2

    博客信息 沈阳航空航天大学计算机学院2020软件工程作业 作业要求 https://edu.cnblogs.com/campus/sau/Computer1701-1705/homework/1058 ...

  6. vue-固定头部-内容可滚动

     <div class="show-box">             <div class="show-top">           ...

  7. 【js】js执行机制-js单线程-同步和异步

    js是单线程 即同一个时间只能做一件事,JavaScript是为处理页面中用户的交互,以及操作DOM而诞生的.比如我们对某个DOM元素进行添加和删除操作,不能同时进行.应该先进行添加,之后在进行删除. ...

  8. C# 动态操作 控件位置绑定 [ Anchor ] 属性

    注: 1.此类属于非常用类,只因本人需要编写的...顺便刷贴一下 2.对于初学,其中的枚举使用可以为你加深一点印象 以下为操作类代码: public class AchCtrer { #region ...

  9. c语言数据结构 树的基本操作

    树的基本操作有创建,插入,删除,以及各种遍历的应用,如:利用后序遍历求高度,利用前序遍历求层数的结点 基本算法思路:创建二叉树函数参数必须接受二级指针!如果使用同级指针,无法返回创建后的结果,利用递归 ...

  10. (c语言描述 函数递归汉诺塔)

    汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序 ...