利用 yaml-cpp 开源库读写 yaml 配置文件—— 读写部分

  • YAML文件解析
    • Node
    • 读写yaml文件
      • config.yaml内容
      • test_yaml.cpp文件内容
      • 重要内容简单解释
    • node的增改查删

YAML文件解析

Node

Node 是 yaml-cpp 中的核心概念,是最重要的数据结构,它用于存储解析后的 yaml 信息。
Node一共有以下几种type:
1)Null 空节点
2)Sequence 序列,类似于一个Vector,对应YAML格式中的数组
3)Map 类似标准库中的Map,对应YAML格式中的对象
4)Scalar 标量,对应YAML格式中的常量

生成 Node 的形式有很多种,loadFile() 是最常见的一种。
Node LoadFile(const std::string& filename) ,其中filename 就是yaml文件的路径。

有了 Node 之后,所有的信息都可以检索到。比如 name.
cout << “name:” << config[“name”].as() << endl;其中as()表示将解析的内容转换成 string 类型,也可以转换成其它类型。

读写yaml文件

假设配置文件config.yaml

config.yaml内容

name: frank
sex: male
age: 18
skills: c++: 1java: 1android: 1python: 1

注意:yaml 中的内容,: 后面一定要加空格

test_yaml.cpp文件内容

#include <iostream>
#include "yaml-cpp/yaml.h"
#include <fstream>
using namespace std;
int main(int argc,char** argv)
{YAML::Node config;try{config = YAML::LoadFile("../config.yaml");} catch(YAML::BadFile &e) {std::cout<<"read error"<<std::endl;return -1;}cout << "Node type " << config.Type() << endl;cout << "skills type " << config["skills"].Type() << endl;cout << "name:" << config["name"].as<string>() << endl;cout << "sex:" << config["sex"].as<string>() << endl;cout << "age:" << config["age"].as<int>() << endl;//读取不存在的node值,报YAML::TypedBadConversion异常try{string label = config["label"].as<string>();}catch(YAML::TypedBadConversion<string> &e){std::cout<<"label node is NULL"<<std::endl;}//TypedBadConversion是模板类,读取什么类型的参数就传入什么类型cout << "skills c++:" << config["skills"]["c++"].as<int>() << endl;cout << "skills java:" << config["skills"]["java"].as<int>() << endl;cout << "skills android:" << config["skills"]["android"].as<int>() << endl;cout << "skills python:" << config["skills"]["python"].as<int>() << endl;//通过迭代的方式,访问 skills 下面的各个元素for(YAML::const_iterator it= config["skills"].begin(); it != config["skills"].end();++it){cout << it->first.as<string>() << ":" << it->second.as<int>() << endl;}YAML::Node test1 = YAML::Load("[1,2,3,4]");cout << " Type: " << test1.Type() << endl;YAML::Node test2 = YAML::Load("1");cout << " Type: " << test2.Type() << endl;YAML::Node test3 = YAML::Load("{'id':1,'degree':'senior'}");cout << " Type: " << test3.Type() << endl;//将score 写入./testconfig.yamlofstream fout("./testconfig.yaml");config["score"] = 99;//添加新元素fout << config;fout.close();return 0;
}

重要内容简单解释

1)Node
Node 是 yaml-cpp 中的核心概念,它用于存储解析后的 yaml 信息。
生成 Node 的形式有很多种, loadFile() 是最常见的一种。

Node LoadFile(const std::string& filename)

filename 就是配置文件的路径。
有了 Node 之后,所有的信息都可以检索到。

2)skills 的信息怎么读呢?

skills:  c++: 1java: 1android: 1python: 1

其实也非常简单

cout << "skills c++:" << config["skills"]["c++"].as<int>() << endl;
cout << "skills java:" << config["skills"]["java"].as<int>() << endl;
cout << "skills android:" << config["skills"]["android"].as<int>() << endl;
cout << "skills python:" << config["skills"]["python"].as<int>() << endl;

yaml-cpp 中也可以通过迭代的方式,访问 Node 中的内容
比如,访问 skills 下面的各个元素

for(YAML::const_iterator it= config["skills"].begin(); it != config["skills"].end();++it)
{cout << it->first.as<string>() << ":" << it->second.as<int>() << endl;
}

用 begin() 获取迭代器,用 end() 判断迭代器是否结束。

3)NodeType
yaml 支持 Scalar、List、Map 类型,yaml-cpp 通过 NodeType 定义了 Node 的可能类型。

namespace YAML {
struct NodeType {enum value { Undefined, Null, Scalar, Sequence, Map };
};
}

对应未定义、空、标量、序列、字典。

YAML::Node test1 = YAML::Load("[1,2,3,4]");
cout << " Type: " << test1.Type() << endl;YAML::Node test2 = YAML::Load("1");
cout << " Type: " << test2.Type() << endl;YAML::Node test3 = YAML::Load("{'id':1,'degree':'senior'}");
cout << " Type: " << test3.Type() << endl;

上面的代码是为了判断 NodeType。

结果如下:

Type: 3
Type: 2
Type: 4

分别对应 Sequence、Scalar、Map。

4)yaml-cpp 写配置文件
日常开发中,除了读取配置参数,我们经常需要保存参数,yaml-cpp也提供了相应的功能。

ofstream fout("./testconfig.yaml");
config["score"] = 99;
fout << config;
fout.close();

将读取的config,添加一个 score,然后保存。
运行代码后,发现 build 文件夹下多了 testconfig.xml 文件,score 也被添加进去。

name: frank
sex: male
age: 18
skills:c++: 1java: 1android: 1python: 1
score: 99

5)总结:
std::ifstream file(“config.yaml”);
YAML::Node node = YAML::Load(file);//读取来自test.yaml的node文件YAML
std::cout << node <<std::endl;
//或者
YAML::Node node_2 = YAML::LoadFile(“config.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;//也可以用迭代器访问

node的增改查删

#include <fstream>
#include <yaml-cpp/yaml.h>
#include <iostream>
#include <assert.h>int main()
{YAML::Node node;  assert(node.IsNull());  //初始化的节点是Null类型node["key"] = "value";  //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是一个Mapnode["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插入了一个Sequencenode_2.push_back(v);assert(node_2.IsSequence());//node_2仍然是一个Sequenceassert(node_2[0].as<std::string>() == "first item");//对于Sequence类型,你可以使用它的下标来访问//注意这里as<T>是一个模板转换,node_2[0]的type是NodeType::Scalarauto 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;
}

最后cout的结果如下:

key: value
number: 255
seq:- first element- second element
node_2:0: first item1: second_item2: third_item3:- 1- 3- 5- 7- 9key: value

注:如有侵权,请联系删除!

利用 yaml-cpp 开源库读写 yaml 配置文件—— 读写部分相关推荐

  1. java的算法库_利用Java写开源库 覆盖70多种推荐算法

    描述 在经过一年多的开发工作之后,LibRec 3.0 版本终于发布了.LibRec 是一个基于 Java 的开源算法工具库,覆盖了 70 余个各类型推荐算法,可以有效解决评分预测和物品推荐两大关键的 ...

  2. 推荐算法实现java_利用Java写开源库 覆盖70多种推荐算法

    在经过一年多的开发工作之后,LibRec3.0版本终于发布了.LibRec是一个基于Java的开源算法工具库,覆盖了70余个各类型推荐算法,可以有效解决评分预测和物品推荐两大关键的推荐问题,目前已经在 ...

  3. C++读写yaml配置文件

    文章目录 YAML基础语法 基本规则 三种数据结构 map,散列表 list,数组 scalar,纯量 数据结构嵌套 map嵌套map map嵌套list list嵌套list list嵌套map 利 ...

  4. Python读写yaml文件(使用PyYAML库)

    一,YAML 简介 YAML,Yet Another Markup Language的简写,通常用来编写项目配置,也可用于数据存储,相比conf等配置文件要更简洁. 二,YAML 语法 支持的数据类型 ...

  5. NPM酷库045:js-yaml,读写YAML

    NPM酷库,每天两分钟,了解一个流行NPM库.· 在NPM酷库044中,我们了解到了相对于JSON格式更加易于编写和维护的JSON5,今天我们继续学习另外一个更加简单易读的数据格式YAML. 下方就是 ...

  6. 【转】DCMTK开源库的学习笔记4:利用ini配置文件对dcm影像进行归档

    转自:https://blog.csdn.net/zssureqh/article/details/8846337 背景介绍: 医学影像PACS工作站的服务端需要对大量的dcm文件进行归档,写入数据库 ...

  7. python 第三方模块 yaml - 处理 YAML (专门用来写配置文件的语言)

    markdown 的配置使用 Yaml -- Yet Another Markup Language :另一种标记语言. 简介 YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格 ...

  8. 利用人工智能(Magpie开源库)给一段中文的文本内容进行分类打标签

    当下人工智能是真心的火热呀,各种原来传统的业务也都在尝试用人工智能技术来处理,以此来节省人工成本,提高生产效率.既然有这么火的利器,那么我们就先来简单认识下什么是人工智能吧,人工智能是指利用语音识别. ...

  9. .NET平台开源项目速览(1)SharpConfig配置文件读写组件

    原文:.NET平台开源项目速览(1)SharpConfig配置文件读写组件 在.NET平台日常开发中,读取配置文件是一个很常见的需求.以前都是使用System.Configuration.Config ...

最新文章

  1. C++生成随机数:负二项分布/帕斯卡分布(negative binomial distribution)
  2. JavaScript中九九乘法表制作
  3. C++之STL种类及实现
  4. 需求变更,产品经理的良心也会痛!
  5. NLP学习------HanLP使用实验
  6. 算法:从上往下打印二叉树
  7. IE、FF CSS 兼容性、兼容浏览器的技巧 2
  8. 单火开关和零火开关的区别
  9. Android 面试题集 答案,助你拿到心仪 Offer
  10. 计算机重启事件查看,事件查看器检查上一次电脑关机时间
  11. GEE系列:第 1 单元 Google 地球引擎简介
  12. cad两直线相交画圆弧_CAD两直线,如何用圆弧连接?
  13. 资深程序员骆昊:Python从新手到大师,100天完整学习路线
  14. 生物学中的云计算和大数据
  15. 设计一可控同步四进制可逆计数器, 其由输入X1, X2控制, 用D触发器和74151及必要的门电路实现
  16. 芬兰的诺基亚发布了可以访问互联网的诺基亚9000 Communicator
  17. 栈+模拟(大鱼吃小鱼)
  18. /usr/include/linux/if_ppp.h:117: error: expected specifier-qualifier-list before 'aligned_u64' 解决方式
  19. 【论文阅读】PGM-index
  20. 织梦选php哪个版本,织梦DedeCMS网站及其版本的判断

热门文章

  1. 怎样将PDF文档进行翻译?PDF文档翻译简单方法介绍
  2. 激光测距VL53L0X查询方式 源代码 已测试
  3. 三极管工作原理分析,精辟、透彻
  4. vue 点赞+收藏 图标
  5. 计算机应用技术与物联网专业介绍,《物联网应用技术》专业简介
  6. Android apk瘦身之使用TinyPng压缩图片
  7. 如何快速、科学的配置GO语言编译Android环境
  8. HTTP HTTPS
  9. 人脸识别技术介绍和表情识别最新研究
  10. 计算机新建表格2,(Word表格的制作计算机基础2.doc