使用yaml-cpp 0.6.3在Linux下读取YAML文件出现TypedBadConversion错误求解
问题原因分析
你遇到的YAML::TypedBadConversion异常由以下几个问题共同导致:
- 你提供的
sample.yaml顶层结构是YAML序列(数组),不是键值对映射,不能直接用config["键名"]的方式访问顶层节点 - 你的YAML文件中不存在代码里尝试访问的
Circles字段,访问不存在的节点后做类型转换会直接抛出转换异常 - YAML里的x/y/z均为浮点数类型,直接用
as<std::int64_t>()转换会触发类型不匹配错误 - 代码里
YAML::LoadFile('yamlfile')写法不符合C++语法,字符串字面量需要用双引号包裹
正确读取示例代码
#include <yaml-cpp/yaml.h> #include <iostream> int main() { try { // 字符串用双引号,替换为你的yaml文件实际路径 YAML::Node config = YAML::LoadFile("sample.yaml"); // 先遍历顶层序列 for (const auto& top_item : config) { // 读取Pos字段 std::string pos = top_item["Pos"].as<std::string>(); std::cout << "当前位置:" << pos << "\n矩形坐标点如下:" << std::endl; // 遍历Rectangle下的坐标点序列 const auto& rect_points = top_item["Rectangle"]; for (size_t idx = 0; idx < rect_points.size(); idx++) { const auto& point = rect_points[idx]; // 浮点数用double类型接收 double x = point["x"].as<double>(); double y = point["y"].as<double>(); double z = point["z"].as<double>(); printf("点%zu:x=%.3f, y=%.3f, z=%.3f\n", idx+1, x, y, z); } } } catch (const YAML::Exception& e) { std::cerr << "解析失败:" << e.what() << std::endl; return 1; } return 0; }
注意事项
- 访问节点前可先判断节点是否存在:
if (top_item["Pos"]),避免访问不存在的字段抛出异常 - 可以给
as方法指定默认值,进一步避免异常:point["x"].as<double>(0.0),字段不存在时会返回默认值0.0 - 编译时需要链接yaml-cpp库,编译命令参考:
g++ 你的代码文件名.cpp -o yaml_test -lyaml-cpp
内容的提问来源于stack exchange,提问作者Hosen
相关产品推荐
相关产品推荐

