YamlArrayRead
::
YamlArrayRead
(
)
{
}
void
YamlArrayRead
::
Load
(
std
::
string yaml_path
)
{
YAML
::
Node config
=
YAML
::
LoadFile
(
yaml_path
)
;
std
::
cout
<<
yaml_path
<<
std
::
endl
;
child_node_2_vector
=
config
[
"father_node"
]
[
"child_node_2"
]
.
as
<
std
::
vector
<
std
::
string
>>
(
)
;
for
(
auto
&
elem
:
child_node_2_vector
)
std
::
cout
<<
elem
<<
std
::
endl
;
int
main
(
)
{
std
::
string config_path
=
"路径/config.yaml"
;
YamlArrayRead param_loader
;
param_loader
.
Load
(
config_path
)
;
return
0
;
CMakeLists
cmake_minimum_required(VERSION 3.0.2)
project(YamlArrayRead)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 11)
find_package(Glog REQUIRED)
find_package(Gflags REQUIRED)
find_package (PkgConfig REQUIRED)
pkg_check_modules(YAMLCPP REQUIRED yaml-cpp) # 查找yaml-cpp
link_directories(${YAMLCPP_LIBRARY_DIRS})# 添加yaml-cpp库文件路径
include_directories(
/usr/local/include
${PROJECT_SOURCE_DIR}/src/inc
add_executable(YamlArrayRead YamlArrayRead.cc)
target_link_libraries(YamlArrayRead ${YAMLCPP_LIBRARIES}) # 将yaml-cpp库连接到yaml_demo可执行文件中
YAML简介1 YAML特点2 适用场景3 基础语法3.1 基本规则3.2 三种数据结构3.2.1 map,散列表3.2.2 list 数组3.2.3 纯量3.3 数据结构嵌套3.3.1 map嵌套map3.3.2 map嵌套list3.3.3 list嵌套list3.3.4 list嵌套map3.4 使用锚点4 C++中使用yaml-cpp读写yaml配置文件4.1 使用方法4.2 示例
1 YAML特点
YAML(YAML Ain’t Markup Language)是一个可读性高,用来表达数据序列化的
尽管在实际的项目中有许多现有项目的数据表达都是用 XML 组织的,然而 YAML 作为一种比 XML,或者 JSON 都更为简单易读的序列化语言,正越来越多地被人们所接受和喜欢,并应用于软件项目的开发中,比如:现实生活中的数据上程序中的序列化表示,以及系统中的配置文件的书写。众所周知,XML 的设计使得数据的表达几乎无所不能,那么是什么让 YAML 这个后来者抢占了其一席之地呢?
本文将首先
1:导入头文件#include <yaml-cpp/yaml.h>(需要自己安装)
2:加载文件
YAML::Node config = YAML::LoadFile("/home/hu/catkin_minibus/src/object_perception/src/result_new.yaml");
3:用一个向量来接收文件中的矩阵并强制转换成固定长度,例如4*4就变成16(不要问什么,我也不知道,直接用eigen矩阵赋值会报错)
vector
最近在用C++解析yaml文件,遇到了一个很头疼的bug,有可能大家之后也会遇到,现在分享一下解决方法。
先上bug:第一句vtable for YAML::BadConversion
之后的就不复制粘贴了(主要是我换了终端,之前的输出都没了)
出现这个问题多半是yaml库和ubuntu版本不对应的问题
我的ubuntu是18.04,yaml0.5.0或者0.5.1目前好像都行
在https://github.com/jbeder/yaml-cpp/tags下载源代码,然后把解压的yaml放在/usr/li
在日常开发中,我们总能遇到一些可能需要变化的场景,这个时候就需要配置文件来实现不更换程序的情况下能够改变程序的运行参数。
常见的配置文件格式有很多种,一般包括json、protobuf、xml,还有本文的主角yaml格式。当然选择yaml的理由是因为其相比xml、json等语言简洁强大。
基本语法:
1.大小写敏感;
2.使用缩进表示层级关系;
3.只允許使用空格,...
/* Initialize parser */
if(!yaml_parser_initialize(&parser))
fputs("Failed to initialize parser!\n", stderr);
if(parser.error)
fprintf(stderr, "Parser error %d\n", parser.error);
/* Set input file */
FILE *input = fopen("input.yaml", "rb");
yaml_parser_set_input_file(&parser, input);
/* Read the next token */
yaml_parser_scan(&parser, &token);
if(token.type == YAML_STREAM_START_TOKEN) {
/* Read the next token */
yaml_parser_scan(&parser, &token);
if(token.type == YAML_DOCUMENT_START_TOKEN) {
/* Read the next token */
yaml_parser_scan(&parser, &token);
if(token.type == YAML_SEQUENCE_START_TOKEN) {
/* Read the next token */
yaml_parser_scan(&parser, &token);
/* Read the elements of the sequence */
while(token.type != YAML_SEQUENCE_END_TOKEN) {
/* Process the element */
if(token.type == YAML_SEQUENCE_START_TOKEN) {
/* Read the next token */
yaml_parser_scan(&parser, &token);
/* Read the elements of the inner sequence */
while(token.type != YAML_SEQUENCE_END_TOKEN) {
/* Process the element */
if(token.type == YAML_SCALAR_TOKEN) {
printf("%s\n", token.data.scalar.value);
/* Read the next token */
yaml_parser_scan(&parser, &token);
/* Read the next token */
yaml_parser_scan(&parser, &token);
/* Clean up */
yaml_token_delete(&token);
yaml_parser_delete(&parser);
fclose(input);
return 0;
在这段代码中,我们首先初始化了解析器,然后设置了输入文