关于YAML的介绍可以参考:https://blog.csdn.net/fengbingchun/article/details/88090609
yaml-cpp是用c++实现的用来解析和生成yaml文件的,源码地址在https://github.com/jbeder/yaml-cpp ,这里使用的是最新发布的稳定版0.6.2.
解析和产生yaml文件的测试代码如下:
#include "funset.hpp"
#include
#include
#include
int test_parse_yaml_file()
{
#ifdef _MSC_VER
YAML::Node config = YAML::LoadFile("E:/GitCode/Messy_Test/testdata/test_yaml-cpp.yml");
#else
YAML::Node config = YAML::LoadFile("testdata/test_yaml-cpp.yml");
#endif
std::string blog_name{"xxxxx"}, blog_id{"xxxxx"}, blog_url{"xxxxx"};
if (config["blog"]) {
if (config["blog"]["name"])
blog_name = config["blog"]["name"].as<:string>();
if (config["blog"]["id"])
blog_id = config["blog"]["id"].as<:string>();
if (config["blog"]["url"])
blog_url = config["blog"]["url"].as<:string>();
} else {
fprintf(stderr, "the node blog doesn't exist\n");
}
fprintf(stdout, "blog name: %s, id: %s, url: %s\n",
blog_name.c_str(), blog_id.c_str(), blog_url.c_str());
bool value1, value2;
if (config["value1"])
value1 = config["value1"].as();
if (config["value2"])
value2 = config["value2"].as();
fprintf(stdout, "value1: %d, value2: %d\n", value1, value2);
int number1;
std::string number2, number3;
float number4;
if (config["number1"])
number1 = config["number1"].as();
if (config["number2"])
number2 = config["number2"].as<:string>();
if (config["number3"])
number3 = config["number3"].as<:string>();
if (config["number4"])
number4 = config["number4"].as();
fprintf(stdout, "number1: %d, number2: %s, number3: %s, number4: %f\n",
number1, number2.c_str(), number3.c_str(), number4);
std::string github_url, github_repos;
if (config["github"])
github_url = config["github"][0].as<:string>();
github_repos = config["github"][1].as<:string>();
fprintf(stdout, "github url: %s, repos: %s\n", github_url.c_str(), github_repos.c_str());
return 0;
}
int test_generate_yaml_file()
{
YAML::Node node;
node["language"] = "cpp";
node["version"] = 2;
node["url"].push_back("https://blog.csdn.net/fengbingchun");
node["url"].push_back("https://github.com/fengbingchun");
YAML::Node primes = YAML::Load("[2, 3, 5, 7, 11]");
primes.push_back(13);
fprintf(stdout, "primes size: %d\n", primes.size());
node["primes"] = primes;
YAML::Node lineup = YAML::Load("{1B: Prince Fielder, 2B: Rickie Weeks, LF: Ryan Braun}");
lineup["RF"] = "Corey Hart";
lineup["C"] = "Jonathan Lucroy";
node["name"] = lineup;
node["platform"]["linux"].push_back("x86");
node["platform"]["linux"].push_back("x86_64");
node["platform"]["linux"].push_back("armv7");
node["platform"]["windows"].push_back("x86");
node["platform"]["windows"].push_back("x86_64");
#ifdef _MSC_VER
std::ofstream fout("E:/GitCode/Messy_Test/testdata/tmp.yml");
#else
std::ofstream fout("testdata/tmp.yaml");
#endif
fout << node;
return 0;
}
test_yaml-cpp.yml内容如下:
# config file
---
blog:
name: csdn
id: fengbingchun
url: https://blog.csdn.net/fengbingchun
commands:
version:
- g++ --version
- cmake --version
- git --version
value1: true
value2: false
value3: ~
number1: 123
number2: !!str 123
number3: "123"
number4: !!float 123
github:
- https://github.com/fengbingchun
- NN_Test Face_Test OpenCV_Test
Messy_Test CUDA_Test
data1: |
There once
was a
short man
data2: >
There once
was a
short man
date1: 2019-03-03
step: &id001 # defines anchor label &id001
instrument: Lasik 2000
pulseEnergy: 5.4
step2: *id001 # refers to the first step (with anchor &id001)
...
解析yaml文件输出结果如下:
产生yaml文件的内容如下:
GitHub: https://github.com/fengbingchun/Messy_Test