使用 yaml-cpp 解析 YAML 文件
Parsing YAML file using yaml-cpp
我正在使用yaml-cpp 0.3.0(旧的API版本(来解析yaml文件(我从这里得到的(。
这是 yaml 文件:
- name: Ogre
position: [0, 5, 0]
powers:
- name: Club
damage: 10
- name: Fist
damage: 8
- name: Dragon
position: [1, 0, 10]
powers:
- name: Fire Breath
damage: 25
- name: Claws
damage: 15
- name: Wizard
position: [5, -3, 0]
powers:
- name: Acid Rain
damage: 50
- name: Staff
damage: 3
现在我尝试使用以下代码解析电源名称和损坏:
#include "yaml-cpp/yaml.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
// our data types
struct Vec3 {
float x, y, z;
};
struct Power {
std::string name;
int damage;
};
struct Monster {
std::string name;
Vec3 position;
std::vector <Power> powers;
};
// now the extraction operators for these types
void operator >> (const YAML::Node& node, Vec3& v) {
node[0] >> v.x;
node[1] >> v.y;
node[2] >> v.z;
}
void operator >> (const YAML::Node& node, Power& power) {
node["name"] >> power.name;
node["damage"] >> power.damage;
}
void operator >> (const YAML::Node& node, Monster& monster) {
node["name"] >> monster.name;
node["position"] >> monster.position;
const YAML::Node& powers = node["powers"];
for(unsigned i=0;i<powers.size();i++) {
Power power;
powers[i] >> power;
monster.powers.push_back(power);
}
}
int main()
{
std::ifstream fin("robot.yaml");
YAML::Parser parser(fin);
YAML::Node doc;
parser.GetNextDocument(doc);
for(unsigned i=0;i<doc.size();i++) {
Power power;
doc[i] ["powers"] >> power;
std::cout << power.name << "n";
std::cout << power.damage << "n";
}
return 0;
}
似乎我的代码显示这样的错误:
terminate called after throwing an instance of 'YAML::TypedKeyNotFound<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >'
what(): yaml-cpp: error at line 4, column 5: key not found: name
Aborted (core dumped)
请帮助我理解为什么我不能解析 powers 元素。
请向我解释如何在一个代码中解析所有键和值,因为我是编码新手。
所以问题就在这里:
doc[i] ["powers"] >> power;
doc[i]["powers"]
没有索引"名称":
- name: Ogre position: [0, 5, 0] powers: - name: Club damage: 10 - name: Fist damage: 8
"-"表示项目。所以与doc[i]
类似,你需要首先索引:
Power power;
doc[i]["powers"][0] >> power;
std::cout << power.name //outputs "Club"
但是我假设你想要每个项目的所有功能,所以你需要另一个明确的 for 循环:
for (unsigned i = 0; i < doc.size(); i++)
{
for (unsigned j = 0; j < doc[i]["powers"].size(); ++j)
{
Power power;
doc[i]["powers"][j] >> power;
std::cout << power.name << "n";
std::cout << power.damage << "n";
}
}
但这有点矫枉过正。最好直接使用您的Monster
类,因为幂值已经存储在那里:
for(unsigned i=0;i<doc.size();i++) {
Monster monster;
doc[i] >> monster;
for (auto& power : monster.powers) // range-for loop
{
std::cout << power.name << "n";
std::cout << power.damage << "n";
}
std::cout << monster.name << "n";
}
也许这是一个好的开始。答案的延续将取决于您想要实现的目标。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用 yaml-cpp 解析 YAML 文件
- 如何使用 ROS 从 yaml 文件中读取带有元组的数组?
- 使用YAML -CPP新API - 已修复的YAML文件解决
- 如何从yaml文件中获取特定的类别名称
- 使用yaml :: emitter将嵌套地图和序列编写到yaml文件
- OpenCV 加载 yaml 文件时出错
- YAML::LoadFile(std::string const&) 找不到文件 [ROS 中的 yaml-cpp]
- 如何使用 yaml-cpp 解析文件
- 从yaml文件问题opencv读取数据
- 如何在OpenCV中编辑/更新YAML文件
- C++ YAML:如何编辑/写入 .yaml 文件中的节点
- 将项目附加到YAML文件中的映射中
- 在尝试运行文件时,yaml-cpp出错
- yaml-cpp/yaml.h:没有这样的文件或目录
- OpenCV将PCA特征向量写入yaml文件,丢失精度
- 如何通过YAML-cpp加载YAML文件