C++使⽤yaml配置⽂件使⽤配置⽂件有利于我们灵活配置⼯程,解决⼤量重复劳动,也⽅便调试。
读取config.yaml⽂件中参数内容,并赋值给程序中相关参数。
如果不存在key,会报错:
terminate called after throwing an instance of 'YAML::TypedBadConversion<int>'
what(): yaml-cpp: error at line 0, column 0: bad conversion
已放弃 (核⼼已转储)
⽰例:
yaml_test.cpp
#include <iostream>
#include "yaml-cpp/yaml.h"
#include <fstream>
using namespace std;
typedef struct
{
int cpp;
int java;
int android;
int python;
}Skills;
typedef struct
{
string name;
string sex;
int age;
Skills skills;
} Config;
int test_base()
{
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;
//可以⽤string类型作为下表,读取参数
//可以⽤string类型作为下表,读取参数
string age = "age";
cout << "age when string is label:" << config[age].as<int>() << 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 cpp:" << config["skills"]["cpp"].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;
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;
ofstream fout("./testconfig.yaml"); //保存config为yaml⽂件
config["score"] = 99;//添加新元素
fout << config;
fout.close();
return 0;
}
int use_yaml_config()
{
YAML::Node config;
try{
config = YAML::LoadFile("../config.yaml");
}catch(YAML::BadFile &e){
std::cout<<"read error!"<<std::endl;
return -1;
}
Config param;
//提取, 赋值
param.age = config["age"].as<int>();
param.name = config["name"].as<string>();
param.sex = config["sex"].as<string>();
param.skills.android = config["skills"]["android"].as<int>();
param.skills.java = config["skills"]["java"].as<int>();
param.skills.python = config["skills"]["python"].as<int>();
param.skills.cpp = config["skills"]["cpp"].as<int>();
//查看结果
cout<< " param.age = "<<param.age <<endl;
cout<< " param.name = "<<param.name <<endl;
cout<< " param.sex = "<<param.sex <<endl;
cout<< "param.skills.android = "<<param.skills.android <<endl; cout<< " param.skills.java = "<<param.skills.java <<endl;
cout<< " param.skills.python = "<<param.skills.python <<endl; cout<< " param.skills.cpp = "<<param.skills.cpp <<endl;
return 0;
}
int main(int argc,char** argv)
{
use_yaml_config();
return 0;
}
config.yaml
name: frank
sex: male
age: 18
skills:
cpp: 1
java: 2
android: 3
python: 4
yaml 中的内容,:后⾯⼀定要加空格哦
< 配置
cmake_minimum_required(VERSION 3.2)
project(yaml_test)
add_definitions(-std=c++11)
find_package(yaml-cpp CONFIG REQUIRED)
set(SRCS ./src/yaml_test.cpp)
add_executable(yamltest ${SRCS})
# depend on catkin package
target_link_libraries(yamltest ${catkin_LIBRARIES} yaml-cpp)
mkdir build
cd build
cmake ..
make
./yamltest
执⾏结果:
yuan@linx-c:~/VSCode/CPP_Learning/yaml/yaml_test/build$ ./yamltestparam name
param.age = 18
param.name = frank
param.sex = male
param.skills.android = 3
param.skills.java = 2
param.skills.python = 4
param.skills.cpp = 1
参考:
C++ 解析yaml⽂件的使⽤⽅法
c++ 开发中利⽤yaml-cpp读写yaml配置⽂件
Node 是 yaml-cpp 中的核⼼概念,它⽤于存储解析后的 yaml 信息。
yaml ⽀持 Scalar、List、Map 类型,yaml-cpp 通过 NodeType 定义了 Node 的可能类型。
namespace YAML {
struct NodeType {
enum value { Undefined, Null, Scalar, Sequence, Map }; };
}
对应未定义、空、标量、序列、字典。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论