C++ YAML读写简述

1. yaml-cpp安装

  • yaml-cpp开源库,github地址,其通过CMake进行编译构建,步骤如下:
mkdir build // 新建build文件夹
cd build
cmake -DBUILD_SHARED_LIBS=ON ..
 // 构建上层目录的CMakeLists.txt,编译文件放在build文件夹内
make
sudo make install

ubuntu16.04安装yaml:
sudo apt-get install libyaml-cpp-dev
我的应该是安装其他软件包时依赖所以已经安装了,目录在/usr/include/yaml-cpp,以*.h形式存在。

2. read yaml

#ifdef HAVE_NEW_YAMLCPP
// The >> operator disappeared in yaml-cpp 0.5, so this function is
// added to provide support for code written under the yaml-cpp 0.3 API.
template<typename T>
void operator >> (const YAML::Node& node, T& i)
{
    i = node.as<T>();
}
#endif


void loadYamlFile(std::string name){
  YAML::Node node = YAML::LoadFile(name);
  std::string test_param2;
  node["marker_name"] >> test_param2;
  std::cout << test_param2 << std::endl;
}
// CMakeLists.txt
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3 -Wall")
add_definitions(-std=c++11)
INCLUDE(FindPkgConfig)
pkg_check_modules(NEW_YAMLCPP yaml-cpp>=0.5)
if(NEW_YAMLCPP_FOUND)
add_definitions(-DHAVE_NEW_YAMLCPP)
endif(NEW_YAMLCPP_FOUND)

test.yaml: marker_name: t_1
直接调用loadYamlFile(marker_file);,打印test_param2结果t_1

3. write yaml

std::ofstream out(marker_file, std::ios::app);
std::string marker_name = "t_" + std::to_string(cnt);
std::cout << "marker_name :" << marker_name << std::endl;

Emitter node;
node << BeginMap;
node << Key << "marker_name" << Value << marker_name;
node << Key << "pose" << Value << msg->pose;
node << Key << "---";
node << EndMap;

out << node.c_str();
out << '\n';
out.close();
cnt++;
std::cout << "------------------" << std::endl;

yaml结果:

marker_name: t_1
pose:
  position: [-0.107327938079834, 0.3301165103912354, 0]
  orientation: [0, 0, 0.642, 0.766]
---
marker_name: t_2
pose:
  position: [-1.01, -0.475, 0]
  orientation: [0, 0, 0.868, -0.497]
---
### C++YAML 文件读写操作 #### 包含必要头文件 为了使用 `yaml-cpp` 库处理 YAML 数据,在源代码中需引入相应的头文件。 ```cpp #include <iostream> #include "yaml-cpp/yaml.h" ``` 此部分确保编译器能够识别并链接至 yaml-cpp 提供的功能函数[^1]。 #### 初始化与加载配置文件 通过调用 `YAML::LoadFile()` 函数可以从指定路径加载 YAML 配置文件,并返回表示整个文档结构的根节点对象。 ```cpp YAML::Node config = YAML::LoadFile("../config.yaml"); ``` 上述语句会尝试打开位于项目目录下的 `../config.yaml` 文件,并解析其内容为内存中的树状结构,便于后续访问各个字段的数据项[^2]。 #### 访问具体键值对 一旦成功加载了 YAML 文档,则可以通过索引运算符 (`[]`) 来获取特定键对应的子节点实例;再利用 `.as<T>()` 方法完成类型转换,从而提取实际存储的信息片段。 ```cpp std::cout << "name:" << config["name"].as<std::string>() << std::endl; std::cout << "sex:" << config["sex"].as<std::string>() << std::endl; std::cout << "age:" << config["age"].as<int>() << std::endl; ``` 这里展示了如何逐个输出名为 “name”, “sex” 和 “age” 的属性值。注意每种数据类型的匹配关系对于正确解读至关重要。 #### 创建新的 YAML 节点 当需要向现有或全新的 YAML 文档添加新条目时,可以先构建好待插入的内容层次,之后借助流插入语法轻松实现保存动作。 ```cpp YAML::Emitter out; out << YAML::BeginMap; // 开始定义映射表 out << YAML::Key << "matrix"; out << YAML::Value << YAML::BeginSeq; // 列表序列化起点 for (size_t row = 0; row < matrix.rows(); ++row) { for (size_t col = 0; col < matrix.cols(); ++col) { out << matrix.at<double>(row, col); } } out << YAML::EndSeq; // 结束列表 out << YAML::EndMap; // 关闭当前作用域 std::ofstream fout("output.yaml"); fout << out.c_str(); ``` 这段示范说明怎样把 OpenCV 类型的二维数组转储成标准格式存盘[^3]。 #### 完整示例程序清单 下面给出一个完整的例子,它综合运用以上介绍的技术要点完成了基本功能演示: ```cpp #include <iostream> #include "yaml-cpp/yaml.h" int main() { try { // 加载已有设置 YAML::Node doc = YAML::LoadFile("input.yaml"); // 输出某些感兴趣的部分 std::cout << "Original name: " << doc["person"]["name"].as<std::string>() << '\n'; // 修改某一项参数 doc["person"]["age"] = 30; // 添加全新节段 doc["new_section"] = "This is a new section"; // 将更新后的版本写出到另一位置 std::ofstream ofs("modified.yaml"); ofs << doc; std::cout << "Successfully written modified data to 'modified.yaml'\n"; } catch (const YAML::Exception& e) { std::cerr << "Error while processing YAML file:\n" << e.what() << "\n"; return EXIT_FAILURE; } return EXIT_SUCCESS; } ``` 该案例不仅涵盖了基础 CRUD 操作模式,还加入了异常捕获机制以增强健壮性和用户体验友好度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值