如果不存在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;
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 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异常
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;
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 中的内容,:后面一定要加空格哦
CMakeLists.txt 配置
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)
yuan@linx-c:~/VSCode/CPP_Learning/yaml/yaml_test/build$ ./yamltest
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文件的使用方法 https://blog.csdn.net/sunlin972913894/article/details/103038082
c++ 开发中利用yaml-cpp读写yaml配置文件 https://blog.csdn.net/briblue/article/details/89515470
Node 是 yaml-cpp 中的核心概念,它用于存储解析后的 yaml 信息。
yaml 支持 Scalar、List、Map 类型,yaml-cpp 通过 NodeType 定义了 Node 的可能类型。
namespace YAML {
struct NodeType {
enum value { Undefined, Null, Scalar, Sequence, Map };
对应未定义、空、标量、序列、字典。
读取config.yaml文件中参数内容,并赋值给程序中相关参数。示例: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{
在程序员的开发生涯中,读写配置文件必不可少。
配置文件有利于我们灵活配置工程,解决大量重复劳动,也方便调试。
配置文件的格式有很多,最简单的有一行一行的文本,也有像 json、xml、protocol buffer 这样结构化的格式,当然也有 yaml 这种格式。
今天的博文介绍的是如何在 C++ 开发中利用 yaml-cpp 开源库读写 yaml 配置文件。
如果有 Python 开发经验的同学...
yaml-cpp 是一个开源库,地址在 github 上,https://github.com/jbeder/yaml-cpp
yaml-cpp 默认构建的就是静态库,也就是 unix 类系统下的 .a 文件,如果你想构建动态库的话,就需要在 cmake 时指定。
下载解压之后
mkdir build
cd build
cmake -DYAML_BUILD_SHARED_LIBS=ON ..
编译成功后,会生成库文件,你只需要将库文件和头文件拷贝到.
文章目录YAML基础语法基本规则三种数据结构map,散列表list,数组scalar,纯量数据结构嵌套map嵌套mapmap嵌套listlist嵌套listlist嵌套map利用yaml-cpp读写yaml配置文件首先下载源码读取 yaml 配置文件NodeNode 是 yaml-cpp 中的核心概念,它用于存储解析后的 yaml 信息。yaml-cpp 中的迭代NodeTypeyaml-cpp 写配置文件
YAML基础语法
YAML所表示的YAML Ain’t Markup Language,YAML 是
WORK_SPACE_PATH: /home/ylh/ros_ws/src
/home/ylh/ros_ws/src/config/config.yaml
terminate called after throwing an instance of 'YAML::BadFile'
what(): bad file
报错意思,读
(更多详情、使用方法,请下载后细读README.md文件)
odrive_ros2_control\nENGLISH / 中文\n介绍\nros2_control 的 ODrive 驱动程序\n兼容性\nROS 2 狡猾的菲茨罗伊 ROS 2 谦逊的玳瑁\nODrive 固件 v0.5.3 狡猾的fw-v0.5.3 谦虚-fw-v0.5.3\nODrive 固件 v0.5.1 狡猾的fw-v0.5.1 谦虚-fw-v0.5.1\n文档\n一周\n完毕\n支持 USB 上的本机协议\n支持位置、速度、扭矩命令\n支持位置、速度、扭矩反馈\n支持使用多个 ODrive\n支持控制模式的平滑切换\n单位转换遵循REP-103\n支持在每个 ODrive 上使用任何一个或两个轴\n允许多轴在不同的控制模式下运行\n提供传感器数据(误差、电压、温度)\n自动看门狗喂食\n全部\n支持串口和CAN\n支持前馈控制输入\n基于 URDF 和 YAML 文件的 ODrive 自动配置
ESPHome社区
我的ESPHome设备
我的ESP8266 / ESP32插头和电路板的配置文件,可用于家庭助理。 我大量使用!include文件来限制代码重复。 这使我可以专注于为诸如浴室风扇控制器和灌溉控制器之类的项目创建的高级代码。
通用配置文件
/常见的/
在common文件夹中,您将找到代表状态指示灯,wifi,api和日志记录的重复配置块。 Sonoff和Tuya插件在/ common / templates /文件夹中共享通用代码。 @AlexMekkering感谢您。
bluetooth_hub.yaml
我从上的示例开始,并添加了小米温度设备传感器。
灌溉控制器:raining.yaml
由电池和云供电的Melnor Raincloud / Aquatimer断断续续地运行了好几年。 现在,即使是新电池也无法解决问题。 另外,电池仓内部似乎有电