C++ YAML:如何编辑/写入 .yaml 文件中的节点
Posted
技术标签:
【中文标题】C++ YAML:如何编辑/写入 .yaml 文件中的节点【英文标题】:C++ YAML: How to edit/write to a node in a .yaml file 【发布时间】:2015-01-27 13:20:29 【问题描述】:我正在尝试编写一个函数,该函数将使用yaml-cpp
在我的.yaml
文件中写入/编辑一个节点。我有点让它工作,因为我的代码将编辑本地副本。当我打印出_baseNode
时,它显示该节点的值是 5.4。但是,退出函数并在我的计算机上检查我的.yaml
后,值 5.4 不存在。
这是我的尝试(_baseNode
是我班级的私人成员):
void ParametersServerPC::testFunc2()
boost::filesystem::path path(boost::filesystem::initial_path() / _parameterFileName);
_baseNode = YAML::LoadFile(_parameterFileName);
_baseNode["chip"]["clock_rate"]["3"] = 5.4;
std::cout << _baseNode << std::endl;
对于我的第二次尝试,我创建了一个YAML::Node& baseNode
:
YAML::Node& baseNode = YAML::LoadFile(_parameterFileName);
然后我得到这个错误:
invalid initialization of non-const reference of type 'YAML::Node&' from an rvalue of type 'YAML::Node'
对于那些感兴趣的人,.yaml
文件看起来像这样:
chip:
clock_rate:
0: 1.0
1: 1.0
2: 1.0
3: 3.0
4: 1.0
我想将 3
映射的值从 3.0 更改为 5.4。
【问题讨论】:
您希望LoadFile
做什么?很明显,它将数据加载到内存中,并且没有为文件系统提供神奇的接口。您必须使用Emitter
API 将更改后的树显式写回文件系统,检查***.com/questions/3342355/…。
哦,好吧,这是有道理的。我认为根据教程 (code.google.com/p/yaml-cpp/wiki/Tutorial#Building_Nodes) 我可以在文件上构建节点。然后我会研究这个Emitter
API,干杯:)
【参考方案1】:
就像@filmor 在 cmets 中所说的那样,LoadFile
仅将数据加载到内存中,不提供文件系统接口。
因此,编辑.yaml
文件,您必须首先编辑文件的根节点并将其转储回文件中,如下所示:
YAML::Node node, _baseNode = YAML::LoadFile("file.yaml"); // gets the root node
_baseNode["change"]["this"]["node"] = "newvalue"; // edit one of the nodes
std::ofstream fout("fileUpdate.yaml");
fout << _baseNode; // dump it back into the file
【讨论】:
以上是关于C++ YAML:如何编辑/写入 .yaml 文件中的节点的主要内容,如果未能解决你的问题,请参考以下文章