【发布时间】:2020-05-09 22:42:13
【问题描述】:
所以我有几个虚拟护目镜......每个都有不同的校准参数。我决定将这些参数保存到一个 yaml 文件中(作为配置文件).. 每个护目镜都有自己的序列号/标识号......并根据这个数字,我选择使用哪个。 如果护目镜没有预先保存的信息。我校准它并将这些参数添加到文件中
所以现在我正在尝试写入一个看起来像这样的 yaml 文件:
Headset:
IdentificationNumber: b630cc42-9a03-42da-a039-0e023cf5b090
GyroOffset:
GyroX:
Value: -0.013776619
GyroY:
Value: -0.016475508
GyroZ:
Value: -0.0114268782
这就是我实际得到的:
Headset2:
IdentificationNumber: b630cc42-9a03-42da-a039-0e023cf5b090
? GyroOffset:
GyroX:
Value: -0.013776619
? GyroY:
Value: -0.016475508
: GyroZ:
Value: -0.0114268782
我不知道我做错了什么! .. 这是我写入 yaml 文件的函数:
void ParseInputDeviceYaml::addCalibrationToConfigFile(const char* identificationNumber, const float* in)
{
try {
std::ofstream updatedFile;
updatedFile.open(m_filename.toStdString(), std::ios::app);
std::map<std::string, std::string> IDNumber;
std::map<std::string, std::map<std::string, float>> gyroXOffset;
std::map<std::string, std::map<std::string, float>> gyroYOffset;
std::map<std::string, std::map<std::string, float>> gyroZOffset;
IDNumber["IdentificationNumber"] = identificationNumber;
gyroXOffset["GyroX"]["Value"] = *in;
gyroYOffset["GyroY"]["Value"] = *(in + 1);
gyroZOffset["GyroZ"]["Value"] = *(in + 2);
YAML::Emitter newNode;
newNode << YAML::BeginMap;
newNode << YAML::Key << "Headset2";
newNode << YAML::Value << YAML::BeginMap << YAML::Key << "IdentificationNumber" << YAML::Value << identificationNumber << YAML::EndMap;
newNode << YAML::BeginMap << YAML::Key << "GyroOffset" << YAML::Value << gyroXOffset << gyroYOffset << gyroZOffset << YAML::EndMap;
newNode << YAML::EndMap;
updatedFile << newNode.c_str() << "\n";
updatedFile.close();
} catch (std::exception& e) {
LOG4CPLUS_FATAL(m_logger, e.what());
throw std::runtime_error(QObject::tr("Writing gyroscope offsets ").toStdString());
}
}
【问题讨论】:
-
为什么 YAML 中的所有内容都在序列中?您是否希望一个耳机有多个
IdentificationNumbers 或多个GyroOffset列表?如果您删除所有序列,阅读它会更简单,我看不出其中任何一个原因。 -
另外,
Version与Headset1处于同一级别并不好(我认为这里会有更多耳机),因为Version不是耳机。这对实现来说是一个不必要的负担,如果在Version之后会有Heasets:这是一个包含耳机的地图,那就更简单了。 -
我相信我现在把问题改得更具体了。当然,使用地图读取数据更简单。但我还有另一个问题。现在在问题中说明了这一点。
-
好的,更清楚的是,您使用显式
?键显示的 YAML 是实际输出;我写了我的答案,假设这是您精心设计的输入。问题是您将映射写入键,如果您使用我建议的辅助类的方法,这仍然是可以避免的。
标签: c++ parsing maps yaml yaml-cpp