使用yaml-cpp获取嵌套在密钥层次结构

时间:2017-02-17 06:53:19

标签: yaml-cpp

初步问题

我有一个config.yaml,其结构类似于

some_other_key: 34

a:
  b:
    c:
      d: 3

我以为我能做到

YAML::Node config = YAML::LoadFile(config_filename.c_str());
int x  = config["a"]["b"]["c"]["d"].as<int>();

但我得到

terminate called after throwing an instance of
'YAML::TypedBadConversion<int>' 
what():  bad conversion

如何通过config.yaml下载以提取这样的值?如果我错误地输入路径中的一个键,我也会得到同样的异常,所以如果我不小心使用空节点或者转换有效节点时出现问题,我就无法判断错误。 s值为int

第一次回复后跟进

感谢您的回复!也许这是config.yaml中的问题?这是一个重现的小例子,

yaml文件:config2.yaml

daq_writer:
  num: 3
  num_per_host: 3
  hosts:
    - local
  datasets:
    small:
      chunksize: 600

Python可以读取它:

顺便说一下,我在rhel7上使用Linux,但是从python 3.6环境看,一切看起来都不错:

$ python -c "import yaml; print(yaml.load(open('config2.yaml','r')))"
{'daq_writer': {'num_per_host': 3, 'num': 3, 'datasets': {'small': {'chunksize': 600}}, 'hosts': ['local']}}

C ++ yaml-cpp代码

文件yamlex.cpp:

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

int main() {
  YAML::Node config = YAML::LoadFile("config2.yaml");
  int small_chunksize = config["daq_writer"]["datasets"]["smal"]["chunksize"].as<int>();
}

当我编译并运行它时,我得到:

(lc2) psanagpu101: ~/rel/lc2-hdf5-110 $ c++ --std=c++11 -Iinclude -Llib -lyaml-cpp yamlex.cpp
(lc2) psanagpu101: ~/rel/lc2-hdf5-110 $ LD_LIBRARY_PATH=lib ./a.out
terminate called after throwing an instance of 'YAML::TypedBadConversion<int>'
  what():  bad conversion
Aborted (core dumped)
(lc2) psanagpu101: ~/rel/lc2-hdf5-110 $ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)

我已经能够读取顶级键,比如上面引用的some_other_key,但是当我使用这个嵌套键时出错了。很高兴知道语法有效!

1 个答案:

答案 0 :(得分:1)

你的密钥中有一个拼写错误:而不是“小”,你写了“小”。