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&amp; 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 文件中的节点的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenCV 中编辑/更新 YAML 文件?

编辑单个 YAML 值而不更新 YAML 其余部分的格式(YAML CPP)[重复]

如何在文件中写入 YAML 格式的数据?

python——Yaml

如何安装和使用 YAML-Cpp

我想加载一个 YAML 文件,可能编辑数据,然后再次转储。如何保留格式?