yaml文件解析:c++篇
本文使用 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++篇相关推荐
- yaml文件解析:golang篇
本文使用 golang 库 viper 对 yaml 文件进行解析. 下载 执行 go get github.com/spf13/viper 安装. golang 中 yaml 文件解析较多.本文选用 ...
- SDU信息门户(12)系统配置的yaml文件解析
2021SC@SDUSC 目录 一.引言 二.docker安装及yaml文件分析 1.安装 2.yaml文件分析 version build cap_add,cap_drop cgroup_paren ...
- yaml文件解析:nodejs篇
本文使用 nodejs 的 yamljs 库对 yaml 文件进行解析. 安装 直接使用 npm i yamljs 即可安装. 测试 yaml 配置文件 # yaml测试样例 # null 或 NUL ...
- YAML文件解析大全
我们学习Java,都是先介绍properties文件,使用properties文件配合Properties对象能够很方便的适用于应用配置上.然后在引入XML的时候,我们介绍properties格式在表 ...
- 文件操作安全之-文件解析原理篇
本节将详细的解释一下文件解析相关内容,作为我的专栏<WEB安全原理和多种防御方法解读>中的一节. 本文所涉及的文件解析主要指的是WEB领域的文件解析.当访问一个网站或者某个网站特定的页面, ...
- go解析yaml文件示例
yaml文件已经成为配置的一种主要格式,因此各种语言都提供了相应的解析类库, 本文就以go语言中常用的yaml解析库 gopkg.in/yaml为例,简单展示一下如何解析yaml文件 具体代码在这里: ...
- dump文件_一种比Xml更敏捷的配置方式,Python Yaml 配置文件解析模块详解
为什么选择Yaml Yaml的可读性好.扩展性好. Yaml和脚本语言的交互性好. Yaml使用实现语言的数据类型. Yaml有一个一致的信息模型. Yaml易于实现. Yaml试图用一种比Xml更敏 ...
- 如何在Python中解析YAML文件
如何在Python中解析YAML文件? #1楼 不依赖C标头的最简单,最纯净的方法是PyYaml( 文档 ): #!/usr/bin/env pythonimport yamlwith open(&q ...
- 深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
文章目录: 1 yaml说明介绍 1.1 yaml介绍 1.2 YAML 相关网址 2 YAML的python包PyYAML的使用 2.1 关于PyYAML的相关网址 2.2 安装PyYAML 2.3 ...
最新文章
- python播放音频及playsound模块解除占用的3种方法
- 【OpenCV学习】抠图
- Handler消息机制(七):Message的数据结构是什么样子
- html+店铺+可视化编辑器,开源在线可视化HTML编辑器 – xhEditor | 骤雨打新荷
- pycharm活动模板
- 波卡链Substrate (7)Grandpa协议三“2阶段同步”
- 如何批量删除会计科目、供应商、客户的主数据
- EasyExcel读取文件异常,报 java.lang.NoClassDefFoundError,/x2006/main/CTTableStyles
- 计算机信息系统安全保护条例最新,计算机信息系统安全保护条例.doc
- 2018 美团、腾讯、头条、蔚来 社招面试随谈
- 《推荐系统笔记(十一)》Learning to rank(LTR排序问题)的介绍和RankNet算法(内含详细推导)
- XSS的DOS攻击之 server limit dos
- 改变自己就是改变世界的开始
- QuantLib 金融计算——基本组件之 Date 类
- NDK开发Android端RTMP直播推流程序
- (20191227已解决)从Linux服务器下载超过4G的文件并批量操作同类型文件
- 解决virtualbox导入虚拟机报错E_INVALIDARG (0x80070057)问题
- 限制input输入字符数(中文2个字符,英文1个字符)
- 有关汽车仪表的LED与LCD识别
- laravel5.8整合JWT