标签: yaml-cpp

yaml-cpp 读取项目中的序列

如何使用 yaml-cpp 读取此 YAML 文件:

sensors:
  - id: 5
    hardwareId: 28-000005a32133
    type: 1
  - id: 6
    hardwareId: 28-000005a32132
    type: 4
Run Code Online (Sandbox Code Playgroud)

我不明白我如何获得sensors物品,使用它。

据我了解sensors是一个YAML::Node. 我怎么才能得到它?

更新 1:

YAML::Node config = YAML::LoadFile(config_path);
const YAML::Node& node_test1 = confg["sensors"];

for (std::size_t i = 0; i < node_test1.size(); i++) {
    const YAML::Node& node_test2 = node_test1[i];
    std::cout << "Id: " << node_test2["id"].as<std::string>() << std::endl;
    std::cout << "hardwareId: " << node_test2["hardwareId"].as<std::string>() << std::endl << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

此代码有效,但它是使用有关旧 api 的教程编写的。我认为这段代码可以用迭代器重写,但我现在不知道如何重写。

c++ yaml yaml-cpp

3
推荐指数
1
解决办法
8205
查看次数

在 ROS 中使用 yaml-cpp 时出错?

我正在尝试使用 yaml-cpp,根据 wiki 它是系统依赖项,因此我们甚至不需要更改 CMakelists.txt 或 manifest.xml。然而,当我编译代码时,我仍然收到如下错误:

/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:53: undefined reference to `YAML::Parser::Parser(std::basic_istream<char, std::char_traits<char> >&)'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:54: undefined reference to `YAML::Node::Node()'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:92: undefined reference to `YAML::Node::~Node()'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:92: undefined reference to `YAML::Parser::~Parser()'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:92: undefined reference to `YAML::Node::~Node()'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:92: undefined reference to `YAML::Parser::~Parser()'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:92: undefined reference to `YAML::Node::~Node()'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:92: undefined reference to `YAML::Parser::~Parser()'
Run Code Online (Sandbox Code Playgroud)

我添加到 CMakeLists.txt 的唯一代码是:

target_link_libraries(${PROJECT_NAME} yaml-cpp)
rosbuild_add_executable(image_test src/image_test.cpp)
Run Code Online (Sandbox Code Playgroud)

我在 Linux 中使用 fuerte。有人有什么解决办法吗?

编辑:我找到了我的解决方案!我更改了 CMakeLists.txt 以首先构建可执行文件,然后添加 yaml-cpp 库!

rosbuild_add_executable(image_test src/image_test.cpp)
target_link_libraries(image_test yaml-cpp)
Run Code Online (Sandbox Code Playgroud)

我的 CMakeLists.txt 中的这两行工作正常!

yaml-cpp ros

2
推荐指数
1
解决办法
3260
查看次数

Yaml-cpp(新API) - 嵌套的映射/序列组合和迭代

我对这个api处理地图与序列的处理有很基本的问题.说我有以下结构:

foo_map["f1"] = "one";
foo_map["f2"] = "two";
bar_map["b1"] = "one";
bar_map["b2"] = "two";
Run Code Online (Sandbox Code Playgroud)

我希望将其转换为以下YAML文件:

Node: 
    - Foo:
      f1 : one
      f2 : two
    - Bar:
      b1 : one
      b2 : two
Run Code Online (Sandbox Code Playgroud)

我会这样做:

node.push_back("Foo");
node["Foo"]["b1"] = "one";
...
node.push_back("Bar");
Run Code Online (Sandbox Code Playgroud)

但是在最后一行节点现在已经从一个序列转换为一个映射,我得到了一个例外.我能做到这一点的唯一方法是输出地图地图:

Node:
    Foo:
      f1 : one
      f2 : two
    Bar:
      b1 : one
      b2 : two
Run Code Online (Sandbox Code Playgroud)

这个问题是我无法读回这些文件.如果我迭代Node,我甚至无法获得节点迭代器的类型而不会出现异常.

YAML::Node::const_iterator n_it = node.begin();

for (; n_it != config.end(); n_it++) {
        if (n_it->Type() == YAML::NodeType::Scalar) {
            // throws exception
        }
    }
Run Code Online (Sandbox Code Playgroud)

这应该很容易处理,但一直让我发疯!

c++ yaml-cpp

2
推荐指数
1
解决办法
3134
查看次数

Yaml-cpp解析不起作用冒号后空格丢失

我在yaml-cpp解析器中遇到了问题.当我尝试加载以下定义时:

DsUniversity:
  university_typ: {type: enum, values:[Fachhochschule, Universitat, Berufsakademie]}
  students_at_university: {type: string(50)}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Error: yaml-cpp: error at line 2, column 39: end of map flow not found
Run Code Online (Sandbox Code Playgroud)

我试图在http://yaml-online-parser.appspot.com/http://yamllint.com/上验证yaml的有效性,并且两个服务都报告yaml有效.

问题是由"values:"定义后缺少空格引起的.当yaml更新为以下格式时:

DsUniversity:
  university_typ: {type: enum, values: [Fachhochschule, Universitat, Berufsakademie]}
  students_at_university: {type: string(50)}
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.

是否有任何方法如何配置/更新/修复yaml-cpp解析器以继续结肠后缺少空格的yamls?

补充:似乎问题是由空char作为分隔符的要求引起的.当我简化测试片段时

DsUniversity:[Fachhochschule, Universitat, Berufsakademie]
Run Code Online (Sandbox Code Playgroud)

yaml-cpp解析器将其读作标量值"DsUniversity:[Fachhochschule,Universitat,Berufsakademie]".当冒号后添加空char时,yaml-cpp正确加载带序列的元素.

c++ parsing yaml yaml-cpp

2
推荐指数
1
解决办法
3445
查看次数

C++ YAML:如何编辑/写入.yaml文件中的节点

我正在尝试编写一个函数,用于在我的.yaml文件中编写/编辑节点yaml-cpp.我有点工作,因为我的代码将编辑本地副本.当我打印出来时,_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;

}
Run Code Online (Sandbox Code Playgroud)

对于我的第二次尝试,我创建了一个YAML::Node& baseNode:

YAML::Node& baseNode = YAML::LoadFile(_parameterFileName);
Run Code Online (Sandbox Code Playgroud)

但后来我收到这个错误:

invalid initialization of non-const reference of type 'YAML::Node&' from an rvalue of type 'YAML::Node'
Run Code Online (Sandbox Code Playgroud)

对于那些感兴趣的人,.yaml文件看起来像这样:

chip:
  clock_rate:
    0: 1.0
    1: 1.0
    2: 1.0
    3: 3.0
    4: 1.0
Run Code Online (Sandbox Code Playgroud)

我想将映射的值3从3.0 更改为5.4.

c++ yaml yaml-cpp

2
推荐指数
1
解决办法
4976
查看次数

在yaml-cpp中是否可以获取文档中的顶级键名称

给定以下 example.yaml 文件:

Foo:
  id: 10
  name: "bob"
Run Code Online (Sandbox Code Playgroud)

使用 yaml-cpp,如何获得键名“Foo”?

给出代码:

YAML::Node doc = YAML::LoadFile("sample.yaml");
cout << "doc.Type(): " << doc.Type() << "\n";
cout << "doc.size(): " << doc.size() << "\n";
cout << "doc[Foo][id]: " << doc["Foo"]["id"] << "\n";
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,Type() 是 4(Map)(Foo 是一个 Map)。

size() 正如预期的那样为 1(Foo 是文档中唯一的项目)。

doc[Foo][id] 正如预期的那样是 10。

但我似乎无法弄清楚如何从文档的一个节点中找到“Foo”。迭代 doc 会生成一个 Node,但其大多数操作都会引发异常。

c++ yaml-cpp

2
推荐指数
1
解决办法
5022
查看次数

通过 boost 属性树发出 YAML 迭代(递归)

我有一个小但复杂的树结构。使用 boost 属性树作为容器,我尝试迭代该树,然后使用yaml-cpp库将其发送到 yaml 文件。

例如,我有一个小的嵌套属性树:

fibonacci:
  type: series
  entities:
    golden_ratio:
      ratio: 2.3
    function:
      power_series: 2
Run Code Online (Sandbox Code Playgroud)

我希望我的 yaml 文件看起来像这样。

我编写了一个递归函数来迭代树并发送到 yaml。

//Member variable
YAML::Emitter m_out

void iterator(const boost::property_tree::ptree& tree, const std::string& key)
{
    for (const auto& item: tree)
    {
        if (item.second.data().empty()) //check if map node
        {
            m_out << YAML::BeginMap;
            m_out << YAML::Key << item.first;
        }
        else if (!item.second.data().empty()) //else it is key/value pair
        {
            m_out << YAML::Key << item.first;
            m_out << YAML::Value << item.second.data();
        }
        if (!item.second.empty()) //If …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-propertytree yaml-cpp

2
推荐指数
1
解决办法
2545
查看次数

无效的标量十六进制值0x8000000及以上

我发现从yaml文件获取十六进制值时出现问题.它无法获得十六进制值0x80000000及以上.以下是一个示例C++程序.

// ymlparser.cpp
#include <iostream>
#include <fstream>
#include "yaml-cpp/yaml.h"

int main(void)
{
  try {
    std::ifstream fin("hex.yaml");
    YAML::Parser parser(fin);
    YAML::Node doc;
    parser.GetNextDocument(doc);

    int num1;
    doc["hex1"] >> num1;
    printf("num1 = 0x%x\n", num1);

    int num2;
    doc["hex2"] >> num2;
    printf("num2 = 0x%x\n", num2);
    return 0;
  } catch(YAML::ParserException& e) {
    std::cout << e.what() << "\n";
  }
}
Run Code Online (Sandbox Code Playgroud)

hex.yaml

hex1: 0x7FFFFFFF
hex2: 0x80000000
Run Code Online (Sandbox Code Playgroud)

错误信息在这里.

$ ./ymlparser 
num1 = 0x7fffffff
terminate called after throwing an instance of 'YAML::InvalidScalar'
  what():  yaml-cpp: error at line 2, column 7: invalid …
Run Code Online (Sandbox Code Playgroud)

c++ yaml-cpp

1
推荐指数
1
解决办法
1263
查看次数

为 yaml-cpp 库找到正确的 cmake 配置

我试图在我的项目中使用yaml-cpp。通过尝试以下名称,我花了半个小时才正确链接库。在我最终在这个文件中偶然发现它们之后,我解决了这个问题:

find_package(yaml-cpp REQUIRED)
include_directories(${YAML_INCLUDE_DIRS})
target_link_libraries(${YAML_CPP_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

它有效,但我寻找那些的方式似乎很愚蠢。

如何远程找出包含变量的正确名称?可能是YAML_LIBS, YAML_LIBRARY, YAML_CPP_LIBRARIES, 没有标准吧?为大多数 C++ 库确定正确的 cmake 配置的适当方法是什么?

谢谢你。

c++ cmake yaml-cpp

1
推荐指数
1
解决办法
2276
查看次数

yaml-cpp 比较的意外结果

考虑以下代码 (yamltest.cpp):

#include <yaml-cpp/yaml.h>
#include <iostream>
#include <string>

int main() {
  std::string val = "[1, 2, 3]";
  YAML::Node yn0 = YAML::Load(val);
  YAML::Node yn1 = YAML::Load(val);

  std::cout << "===== yn0 =====\n" << yn0 << std::endl;
  std::cout << "\n"  << std::endl;
  std::cout << "===== yn1 =====\n\n" << yn1 << std::endl;

  std::cout << std::boolalpha;
  std::cout << "yn0 == yn0: " << (yn0==yn0) << std::endl;
  std::cout << "yn1 == yn1: " << (yn1==yn1) << std::endl;

  std::cout << "yn0 == yn1: " << (yn0==yn1) << …
Run Code Online (Sandbox Code Playgroud)

c++ yaml-cpp

0
推荐指数
1
解决办法
552
查看次数

标签 统计

yaml-cpp ×10

c++ ×9

yaml ×3

boost ×1

boost-propertytree ×1

cmake ×1

parsing ×1

ros ×1