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

news2024/12/28 5:09:35

YAML格式介绍

YAML的格式介绍,有关ini、json和xml或许很多人已经很了解了,但是关于YAML,还有许多人不了解。YAML被设计成更适合人类阅读(我想正因为如此,所以相对来说更灵活,就导致到使用的时候很多人会觉得它看起来并不严谨)。它的想法类似于Python,去掉了括号和标签,看起来就比较简洁。废话不多说,直接开搞

官网地址:The Official YAML Web Site

C++关于YAML的库好像找来找去就只有yaml-cpp这个库,并且官网也展示了这个库

yaml-cpp

 

yaml-cpp是一个C++的YAML解析处理库,符合YAML1.2规范

仓库地址:

GitHub - jbeder/yaml-cpp: A YAML parser and emitter in C++

引入头文件

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/796136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostMan+Jmeter+QTP工具介绍及安装

目录 一、PostMan介绍​编辑 二、下载安装 三、Postman与Jmeter的区别 一、开发语言区别&#xff1a; 二、使用范围区别&#xff1a; 三、使用区别&#xff1a; 四、Jmeter安装 附一个详细的Jmeter按照新手使用教程&#xff0c;感谢作者&#xff0c;亲测有效。 五、Jme…

python_day14_综合案例

文件内容 导包配置 import jsonfrom pyspark import SparkContext, SparkConf import osos.environ["PYSPARK_PYTHON"] "D:/dev/python/python3.10.4/python.exe" os.environ["HADOOP_HOME"] "D:/dev/hadoop-3.0.0" conf SparkC…

Megatron-LM、NVIDIA NeMo、model_optim_rng.pt 文件是什么?

本文涉及以下几个概念&#xff0c;分别是&#xff1a; Megatron和Megatron-LM-v1.1.5-3D_parallelism NVIDIA NeMo Megatron和Megatron-LM-v1.1.5-3D_parallelism是什么&#xff1f; Megatron是由NVIDIA开发的一种用于训练大规模语言模型的开源框架。它旨在提供高效的分布式…

鸿蒙4.0重大官宣!六大功能呼之欲出!

鸿蒙系统是当年华为为应对美国封杀而开发的操作系统,当时只是权宜之计&#xff0c;但没想到它的发展壮大远远超出了人们的预期,2021年其用户就突破了1亿,去年7月搭载鸿蒙系统的设备超过了3亿。近日,华为官宣将在今年8月4号的开发者大会上发布全新的鸿蒙4.0系统,系统包含多项让人…

THM-被动侦察和主动侦察

被动与主动侦察# 在计算机系统和网络出现之前&#xff0c;孙子兵法在孙子兵法中教导说&#xff1a;“知己知彼&#xff0c;必胜不疑。” 如果您扮演攻击者的角色&#xff0c;则需要收集有关目标系统的信息。如果你扮演防御者的角色&#xff0c;你需要知道你的对手会发现你的系…

加利福尼亚大学|3D-LLM:将3D世界于大规模语言模型结合

来自加利福尼亚大学的3D-LLM项目团队提到&#xff1a;大型语言模型 (LLM) 和视觉语言模型 (VLM) 已被证明在多项任务上表现出色&#xff0c;例如常识推理。尽管这些模型非常强大&#xff0c;但它们并不以 3D 物理世界为基础&#xff0c;而 3D 物理世界涉及更丰富的概念&#xf…

视频监控管理平台EasyCVR录像的3种方式

视频监控综合管理平台EasyCVR可以实现海量资源的接入、汇聚、计算、存储、处理等&#xff0c;平台具备轻量化接入能力&#xff0c;可支持多协议方式接入&#xff0c;包括主流标准协议GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Eho…

深入理解 python 虚拟机:字节码灵魂——Code obejct

Code Object 数据结构 typedef struct {PyObject_HEADint co_argcount; /* #arguments, except *args */int co_kwonlyargcount; /* #keyword only arguments */int co_nlocals; /* #local variables */int co_stacksize; /* #entries needed for evaluation stack */int co_f…

Flutter 异步编程指南作

1 Dart 中的事件循环模型 在 App 开发中&#xff0c;经常会遇到处理异步任务的场景&#xff0c;如网络请求、读写文件等。Android、iOS 使用的是多线程&#xff0c;而在 Flutter 中为单线程事件循环&#xff0c;如下图所示 Dart 中有两个任务队列&#xff0c;分别为 microtask…

Windows 11的最新人工智能应用Windows Copilot面世!

Windows Copilot是Windows 11预览版中的一项AI辅助功能。 Windows 11还包括设置应用程序的更改&#xff0c;更广泛的支持压缩文件格式。 上个月&#xff0c;微软宣布将继续其将ChatGPT应用于所有产品的冒险之旅&#xff0c;推出了名为Copilot的新Windows 11功能。几个月前&…

难评的Worldcoin,正在登月中

7月24日&#xff0c;前段时间搅混加密舆论界一汪春水的Worldcoin正式上线代币WLD。 由Openai创始人Sam Altman牵头的Worldcoin项目在其试点之初就备受关注&#xff0c;而该种关注在其融资近一亿美金后更是空前&#xff0c;币种上架的呼声不断。 但当代币真的狼来了时&#xff0…

使用CRM分析数据有哪些功能?

CRM数据分析软件可以帮助企业增强竞争力&#xff0c;并更好地了解客户需求及市场变化&#xff0c;助力企业数据分析&#xff0c;并提供实时更新的数据和分析结果&#xff0c;CRM数据分析软件的主要特点是什么&#xff1f;包括以下6个特点。 CRM数据分析软件的主要功能通常包括…

四、约束-2.演示

【案例】 根据需求&#xff0c;完成表结构的创建 创建一个user表&#xff1a; create table user(id int primary key auto_increment comment 主键,name varchar(10) not null unique comment 姓名,age int check ( age > 0 && age < 120 ) comment 年龄,statu…

《嵌入式系统工程师》精讲视频-希赛网--视频笔记

只看我不熟的内容 P8 04流水线 理论公式必须熟悉 P29 01OSI&#xff0f;RM 1年大概考4分&#xff0c;主要考察前3个知识点 应用层--与用户打交道&#xff1b;表示层--压缩、加密等&#xff1b;会话层--建立、终止会话&#xff1b; 传输层--建立端到端连接&#xff1b;网络层--路…

vue-cli-service requires Node ^12.0.0 || >= 14.0.0

运行npm run serve 时&#xff0c;报错如下&#xff1a; 系统&#xff1a;win7 node版本&#xff1a;13.14.0 解决方法&#xff1a; 根据路径&#xff08;node_modules/vue/cli-service/package.json&#xff09;找到package.json文件&#xff0c;并将engines的node属性值改为…

关于Ubuntu 18.04 LTS环境下运行程序出现的问题

关于Ubuntu 18.04 LTS环境下运行程序出现的问题 1.运行程序时出现以下情况 2.检查版本 strings /lib/x86_64-linux-gnu/libc.so.6 |grep GLIBC_​ 发现Ubuntu18.04下的glibc版本最高为2.27,而现程序所使用的是glibc2.34,所以没办法运行, 3.解决办法 安装glibc2.34库, …

C语言每日一题:7.寻找数组中心下标。

思路一&#xff1a; 暴力求解&#xff1a; 1.定义一个ps作为中间下标去记录下标值。 2.循环下标ps从头到位&#xff0c;定义四个变量分别是left sum_left,right,sum_right… 3.初始化leftps-1和rightps1.当ps0—>就让sum_left0,和psn-1->>>sum_right0; 4.循环结尾判…

深入探索文心千帆大模型平台:实现企业级大模型训练和推理

摘要&#xff1a;本文将介绍百度智能云推出的文心千帆大模型平台&#xff0c;以满足企业和个人客户的需求。通过该平台&#xff0c;用户可以进行大模型训练和推理&#xff0c;并且享受一站式的工具链和环境。作者将分享自己在平台上的亲身体验&#xff0c;并提供相关的代码示例…

阿里云RDS数据库高可用版升级为集群版

文章目录 1.在集群中添加两个只读实例1.1.点击添加只读实例1.2.配置实例的计费方式及所在可用区1.3.设置实例的资源规格1.4.选择实例使用的专有网络1.5.确认参数配置及订单信息1.6.查看购买的只读实例 2.开启RDS数据库的读写分离2.1.查看只读实例提供的集群地址2.2.开启RDS的读…

算法(2)

二叉树 镜像二叉树 树轴对称 第一个节点的左子树与第二个节点的右子树同步递归对比&#xff0c;第一个节点的右子树与第二个节点的左子树同步递归比较。 二叉树序列化、反序列化 当然你也可以根据满二叉树结点位置的标号规律来序列化&#xff0c;还可以根据先序遍历和中序遍…