【问题标题】:How to build a node with yaml-cpp?如何使用 yaml-cpp 构建节点?
【发布时间】:2021-02-28 05:10:25
【问题描述】:

我想在我的一个项目中使用 yaml-cpp 来生成一个 yaml 文件,但是我无法弄清楚我必须如何去做。我需要发出的 yaml 文件应该是这样的:

action_counts:
  version: 0.3
  subtree:
    - name: system
      local:
      - name: adder
        action_counts:
          - name: add
            counts: 1000
          - name: idle
            counts: 10000

到目前为止,我还无法写出最后四行。我知道'-' 代表一个数组,但我不知道如何打印名称并计算这样的键。

我已经编写了一些代码来试验 yaml-cpp。代码如下所示:

    YAML::Node node;

    node["action_counts"] = YAML::Null;
    node["action_counts"]["version"] = "0.3";

    node["action_counts"]["subtree"].push_back("system");

    std::ofstream fout("fileUpdate.yaml"); 
    fout << node; 

    return 0;

它产生的输出是这样的:

action_counts:
  version: 0.3
  subtree:
    - system

这里的最后一行是错误的,但我还没有设法找出如何打印- name: system 而不是这个。我该怎么做?

完成后如何打印其余部分? local- name 数组的一部分吗?我想一旦我知道如何将它们格式化为两行,我就可以自己弄清楚其余的。

【问题讨论】:

    标签: c++ yaml yaml-cpp


    【解决方案1】:

    yaml-cpp 库的tests 中可以找到很多创建消息的示例。

    所需的结构可以形成如下:

    #include <fstream>
    #include "yaml-cpp/yaml.h"
    
    int main() {
        YAML::Node action_1;
        action_1["name"] = "add";
        action_1["counts"] = 1000;
    
        YAML::Node action_2;
        action_2["name"] = "idle";
        action_2["counts"] = 10000;
    
        YAML::Node local_item;
        local_item["name"] = "adder";
        local_item["action_counts"].push_back(action_1);
        local_item["action_counts"].push_back(action_2);
    
        YAML::Node local;
        local.push_back(local_item);
    
        YAML::Node subtree_item;
        subtree_item["name"] = "system";
        subtree_item["local"] = local;
    
        YAML::Node root;
        root["action_counts"]["version"] = "0.3";
        root["action_counts"]["subtree"].push_back(subtree_item);
    
        std::ofstream fout("fileUpdate.yaml");
        fout << root;
    
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      数组中的值只是另一个与键 namelocal 的映射,因此您需要将该映射放入数组中,例如:

      YAML::Node systemTree;
      
      systemTree["name"] = "system";
      /* assuming you have put together adderTree similarly */
      systemTree["local"].push_back(adderTree);
      
      YAML::Node root;
      
      root["action_counts"] = YAML::Null;
      root["action_counts"]["version"] = "0.3";
      
      root["action_counts"]["subtree"].push_back(systemTree);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多