本文使用 C++ 库 yaml-cpp 对 yaml 文件进行解析。

下载编译

下载地址:https://github.com/jbeder/yaml-cpp/releases/tag/yaml-cpp-0.6.3 。 文件名为:yaml-cpp-yaml-cpp-0.6.3.zip。
解压,进入库目录,创建build目录。执行:

cd build
cmake ../
make

得到头文件和.a文件。将头文件和.a文件拷贝至工程目录,在编译时进行链接即可。

注:cmake须3.0以上。

测试

yaml 配置文件

# yaml测试样例
# null 或 NULL 为关键字,不能写# 名称
# 字符串
name: conf file# 版本
# 如按浮点,2.0会转换成2
# 如按字符串,保留原样
version: 2.0# 布尔类,转换为1或0
need: true# 时间
time: 2020-10-03T09:21:13empty: nul# 对象
# 加双引号会转义\n,即会换行
my:name: late \n leename1: "late \n lee"age: 99# 块
text: |helloworld!# 数组
fruit:- apple- apple1- apple2- apple3- apple4- apple5# 多级数组
multi:sta:- 110 210 ddd 99- 133 135 1 2 1588 1509- 310-410- 333-444

该示例基本涵盖了大部分的 yaml 格式。包括:字符串,数值、数组、多级map。

测试代码

测试代码如下:


#include <iostream>
#include "yaml-cpp/yaml.h"using namespace std;int main(int argc,char** argv)
{YAML::Node config;// 当文件不存在或yaml格式出错时,抛异常try {config = YAML::LoadFile("config.yaml");} catch (...) {printf("error loading file, yaml file error or not exist.\n");return 0;}// 获取类型for (YAML::const_iterator it = config.begin(); it != config.end(); ++it) {std::string key = it->first.as<std::string>();YAML::Node value = it->second;switch (value.Type()) {case YAML::NodeType::Scalar:printf("key: %s scalar\n", key.c_str());break;case YAML::NodeType::Sequence:printf("key: %s Sequence\n", key.c_str());cout << "seq: " << value << endl;break;case YAML::NodeType::Map:printf("key: %s Map\n", key.c_str());break;case YAML::NodeType::Null:printf("key: %s Null\n", key.c_str());break;case YAML::NodeType::Undefined:printf("key: %s Undefined\n", key.c_str());break;// etc.}}// 顶层cout << "version:" << config["version"].as<float>() << endl;cout << "version(str):" << config["version"].as<string>() << endl;cout << "need:" << config["need"].as<bool>() << endl; // 输出值为1cout << "time:" << config["time"].as<string>() << endl;cout << "empty:" << config["empty"].as<string>() << endl;try {printf("sizeof array: %d\n", (int)config["fruit"].size());//cout << "fruit1:\n" << config["fruit"] << endl; // 此处返回 Node// 索引方式取//for (int i = 0; i < (int)config["fruit"].size(); i++)//{//    cout << "fruit2: " << config["fruit"][i].as<string>() << endl;//}// 单个取for (auto item : config["fruit"]){cout << "fruit3: " << item.as<string>() << endl;}} catch(...) {printf("fruit not ok.\n");}try {printf("new sta: \n");for (auto item : config["multi"]["sta"]){printf("%s \n", item.as<string>().c_str());}printf("\n");} catch (...) {//printf("key not exist...\n");//return 0;}// 对于不存在的key,似乎只能用trytry {cout << "bad:" << config["bad"].as<int>() << endl;} catch (...) {printf("key bad not exist...\n");//return 0;}cout << "text:" << config["text"].as<string>() << endl;// 有两层printf("name: %s \nname1: %s \nage: %d\n", config["my"]["name"].as<string>().c_str(),config["my"]["name1"].as<string>().c_str(),config["my"]["age"].as<int>());return 0;
}

输出结果如下:

./a.out
key: name scalar
key: version scalar
key: need scalar
key: time scalar
key: empty scalar
key: my Map
key: text scalar
key: fruit Sequence
seq: - apple
- apple1
- apple2
- apple3
- apple4
- apple5
key: multi Map
version:2
version(str):2.0
need:1
time:2020-10-03T09:21:13
empty:nul
sizeof array: 6
fruit3: apple
fruit3: apple1
fruit3: apple2
fruit3: apple3
fruit3: apple4
fruit3: apple5
new sta:
110 210 ddd 99
133 135 1 2 1588 1509
310-410
333-444 key bad not exist...
text:hello
world!name: late \n lee
name1: late lee
age: 99

结果说明

1、name: "late \n lee" 输出会换行。而 name: late \n lee 则会原样输出。
2、参数的值不能为 null 或 NULL,但可以为nul。
3、如果字段不存在或非法,会直接报段错误,因此需要用 try catch 读取。

yaml文件解析:c++篇相关推荐

  1. yaml文件解析:golang篇

    本文使用 golang 库 viper 对 yaml 文件进行解析. 下载 执行 go get github.com/spf13/viper 安装. golang 中 yaml 文件解析较多.本文选用 ...

  2. SDU信息门户(12)系统配置的yaml文件解析

    2021SC@SDUSC 目录 一.引言 二.docker安装及yaml文件分析 1.安装 2.yaml文件分析 version build cap_add,cap_drop cgroup_paren ...

  3. yaml文件解析:nodejs篇

    本文使用 nodejs 的 yamljs 库对 yaml 文件进行解析. 安装 直接使用 npm i yamljs 即可安装. 测试 yaml 配置文件 # yaml测试样例 # null 或 NUL ...

  4. YAML文件解析大全

    我们学习Java,都是先介绍properties文件,使用properties文件配合Properties对象能够很方便的适用于应用配置上.然后在引入XML的时候,我们介绍properties格式在表 ...

  5. 文件操作安全之-文件解析原理篇

    本节将详细的解释一下文件解析相关内容,作为我的专栏<WEB安全原理和多种防御方法解读>中的一节. 本文所涉及的文件解析主要指的是WEB领域的文件解析.当访问一个网站或者某个网站特定的页面, ...

  6. go解析yaml文件示例

    yaml文件已经成为配置的一种主要格式,因此各种语言都提供了相应的解析类库, 本文就以go语言中常用的yaml解析库 gopkg.in/yaml为例,简单展示一下如何解析yaml文件 具体代码在这里: ...

  7. dump文件_一种比Xml更敏捷的配置方式,Python Yaml 配置文件解析模块详解

    为什么选择Yaml Yaml的可读性好.扩展性好. Yaml和脚本语言的交互性好. Yaml使用实现语言的数据类型. Yaml有一个一致的信息模型. Yaml易于实现. Yaml试图用一种比Xml更敏 ...

  8. 如何在Python中解析YAML文件

    如何在Python中解析YAML文件? #1楼 不依赖C标头的最简单,最纯净的方法是PyYaml( 文档 ): #!/usr/bin/env pythonimport yamlwith open(&q ...

  9. 深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件

    文章目录: 1 yaml说明介绍 1.1 yaml介绍 1.2 YAML 相关网址 2 YAML的python包PyYAML的使用 2.1 关于PyYAML的相关网址 2.2 安装PyYAML 2.3 ...

最新文章

  1. python播放音频及playsound模块解除占用的3种方法
  2. 【OpenCV学习】抠图
  3. Handler消息机制(七):Message的数据结构是什么样子
  4. html+店铺+可视化编辑器,开源在线可视化HTML编辑器 – xhEditor | 骤雨打新荷
  5. pycharm活动模板
  6. 波卡链Substrate (7)Grandpa协议三“2阶段同步”
  7. 如何批量删除会计科目、供应商、客户的主数据
  8. EasyExcel读取文件异常,报 java.lang.NoClassDefFoundError,/x2006/main/CTTableStyles
  9. 计算机信息系统安全保护条例最新,计算机信息系统安全保护条例.doc
  10. 2018 美团、腾讯、头条、蔚来 社招面试随谈
  11. 《推荐系统笔记(十一)》Learning to rank(LTR排序问题)的介绍和RankNet算法(内含详细推导)
  12. XSS的DOS攻击之 server limit dos
  13. 改变自己就是改变世界的开始
  14. QuantLib 金融计算——基本组件之 Date 类
  15. NDK开发Android端RTMP直播推流程序
  16. (20191227已解决)从Linux服务器下载超过4G的文件并批量操作同类型文件
  17. 解决virtualbox导入虚拟机报错E_INVALIDARG (0x80070057)问题
  18. 限制input输入字符数(中文2个字符,英文1个字符)
  19. 有关汽车仪表的LED与LCD识别
  20. laravel5.8整合JWT

热门文章

  1. 消息称苹果正在启动生产iPhone SE 3
  2. 绿屏后再现“粉屏”门!大量网友投诉iPhone 13粉屏问题 客服:非硬件问题
  3. 小米申请雷军签名商标获批
  4. 男子趁前女友熟睡翻开眼皮,刷脸转走15万!支付宝:几率很小
  5. 潜藏中国30年,营收远超老干妈6倍,它才是真正的隐形辣酱冠军
  6. 特斯拉员工薪酬曝光 最低54万元!
  7. 广告文案被指侮辱女性 茶颜悦色道歉:立即召回相关产品
  8. 任正非表示支持小女儿姚安娜搞文艺
  9. 女子多年未住别墅成剧组拍摄地,网友:看个剧才想起自己还有栋别墅
  10. 搜狗AI助力居理新房打造智能售房新模式