首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yaml-cpp:在发射器中的每个新地图之前禁用自动入门文档(-)

Yaml-cpp:在发射器中的每个新地图之前禁用自动入门文档(-)
EN

Stack Overflow用户
提问于 2018-05-15 09:16:18
回答 1查看 211关注 0票数 1

我正在使用yaml-cpp生成一个结构日志文件,我可以在以后再读取它。这可能不是最好的工作工具,但现在我只是需要一些东西来开始。

但是,我遇到了一些问题,如下面的示例输出所示:

代码语言:javascript
复制
---
0: 42
---
1: 42
---
2: 42
---
3: 42
---
4: 42
...

我想要的是:

代码语言:javascript
复制
---
0: 42
1: 42
2: 42
3: 42
4: 42
...

这是生成它的代码:

代码语言:javascript
复制
YAML::Emitter res;
res << YAML::BeginDoc;
for (int i = 0; i < 5; i++)
{
    res << YAML::BeginMap
        << YAML::Key << i
        << YAML::Value << 42
        << YAML::EndMap;
}
res << YAML::EndDoc;
std::cout << res.c_str() << std::endl;

我查看了源代码(https://github.com/jbeder/yaml-cpp/blob/master/src/emitter.cpp),发现了这一点:

代码语言:javascript
复制
// EmitBeginDoc
void Emitter::EmitBeginDoc() {
  if (!good())
    return;

  if (m_pState->CurGroupType() != GroupType::NoType) {
    m_pState->SetError("Unexpected begin document");
    return;
  }

  if (m_pState->HasAnchor() || m_pState->HasTag()) {
    m_pState->SetError("Unexpected begin document");
    return;
  }

  if (m_stream.col() > 0)
    m_stream << "\n";
  m_stream << "---\n";

  m_pState->StartedDoc();
}

但我在这里所做的一切都超出了我的能力。一方面,我可以做一个小的黑客,只需删除所有--在我把它写到一个文件之前--(当然,第一个除外),但另一方面,我认为我一定忽略了一些细节,这样才能更好地解决这个问题。

编辑:我的例子不能证明地图是合理的,所以我会进一步解释。我正在为大量的图像集合存储一些元信息。当我把它们读回来时,我想直接访问每个图像的信息,即myyamlframe_id"result_x“,其中frame_id可以是3。如果每个图像中都有自己的文档,而不是每次查找时迭代整个文件,我就不知道该如何做。图像不一定是从0到number_of_images的完整序列。

编辑2:参考若昂·奥古斯托编辑的答案,这里有一个更详细的例子,也不起作用:

代码语言:javascript
复制
YAML::Emitter res;
res << YAML::BeginDoc;
for (int i = 3; i < 7; i++)
{
    res << YAML::BeginMap
        << YAML::Key << i
        << YAML::Value
            << YAML::BeginSeq
            << YAML::BeginMap
                << YAML::Key << "Algorithm 1"
                << YAML::Value
                << YAML::BeginSeq
                    << YAML::Flow
                    << YAML::BeginSeq << 54*i << 42/i << 10+i << 17-i << YAML::EndSeq
                    << YAML::Flow
                    << YAML::BeginSeq << 6*i << 3/i << 87+i << 33-i << YAML::EndSeq
                << YAML::EndSeq
            << YAML::EndMap
            << YAML::BeginMap
                << YAML::Key << "Algorithm 2"
                << YAML::Value
                << YAML::BeginSeq
                    << YAML::Flow
                    << YAML::BeginSeq << 65*i << 27/i << 54+i << 76-i << YAML::EndSeq
                    << YAML::Flow
                    << YAML::BeginSeq << 45*i << 66/i << 98+i << 34-i << YAML::EndSeq
                << YAML::EndSeq
            << YAML::EndMap
            << YAML::EndSeq
        << YAML::EndMap;
}
res << YAML::EndDoc;
std::cout << res.c_str() << std::endl;

这是输出:

代码语言:javascript
复制
---
3:
  - Algorithm 1:
      - [162, 14, 13, 14]
      - [18, 1, 90, 30]
  - Algorithm 2:
      - [195, 9, 57, 73]
      - [135, 22, 101, 31]
---
4:
  - Algorithm 1:
      - [216, 10, 14, 13]
      - [24, 0, 91, 29]
  - Algorithm 2:
      - [260, 6, 58, 72]
      - [180, 16, 102, 30]
---
5:
  - Algorithm 1:
      - [270, 8, 15, 12]
      - [30, 0, 92, 28]
  - Algorithm 2:
      - [325, 5, 59, 71]
      - [225, 13, 103, 29]
---
6:
  - Algorithm 1:
      - [324, 7, 16, 11]
      - [36, 0, 93, 27]
  - Algorithm 2:
      - [390, 4, 60, 70]
      - [270, 11, 104, 28]
...

其中仍然有不需要的新文档语句。为了使代码不出现,我需要在代码中更改什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-15 09:40:11

您应该阅读yaml格式的文档。你正在为每个项目创建一张地图,你想要的是这样的东西。

代码语言:javascript
复制
YAML::Emitter res;
res << YAML::BeginDoc << YAML::BeginMap;
for (int i = 0; i < 5; i++)
{
    res << YAML::Key << i
        << YAML::Value << 42;

}
res << YAML::EndMap << YAML::EndDoc;

编辑...

您只需要以您想要访问数据的方式编写yaml,所以如果您这样做:

代码语言:javascript
复制
---
frame_0:
  algorithm_1: 1
  algorithm_2: 2
frame_1:
  algorithm_1: 10
  algorithm_2: 2
frame_2:
  algorithm_1: 8
  algorithm_2: 22
frame_3:
  algorithm_1: 1
  algorithm_2: 23
frame_4:
  algorithm_1: 12
  algorithm_2: 21
...

例如,您可以通过以下操作访问algorithm_2在frame_3中的值:

代码语言:javascript
复制
YAML::Node yaml = YAML::Load(res.c_str());
int value = yaml["frame_3"]["algorithm_2"].as<int>();

编辑...

代码语言:javascript
复制
YAML::Emitter res;
res << YAML::BeginDoc;
res << YAML::BeginMap;
for (int i = 3; i < 7; i++)
{

    res << YAML::Key << i
        << YAML::Value
        << YAML::BeginSeq
        << YAML::BeginMap
        << YAML::Key << "Algorithm 1"
        << YAML::Value
        << YAML::BeginSeq
        << YAML::Flow
        << YAML::BeginSeq << 54 * i << 42 / i << 10 + i << 17 - i << YAML::EndSeq
        << YAML::Flow
        << YAML::BeginSeq << 6 * i << 3 / i << 87 + i << 33 - i << YAML::EndSeq
        << YAML::EndSeq
        << YAML::EndMap
        << YAML::BeginMap
        << YAML::Key << "Algorithm 2"
        << YAML::Value
        << YAML::BeginSeq
        << YAML::Flow
        << YAML::BeginSeq << 65 * i << 27 / i << 54 + i << 76 - i << YAML::EndSeq
        << YAML::Flow
        << YAML::BeginSeq << 45 * i << 66 / i << 98 + i << 34 - i << YAML::EndSeq
        << YAML::EndSeq
        << YAML::EndMap
        << YAML::EndSeq;
}
res << YAML::EndMap;
res << YAML::EndDoc;

这将实现您想做的事情,您的问题是(假设您想要一个从3到7键的映射),您正在为3、4、5、6和7创建一个地图,而不是有一个带有3、4、...,7键的映射。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50346457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档