- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 yaml-cpp 生成一个结构日志文件,我可以稍后再次读回该文件。它可能不是这项工作的最佳工具,但现在我只需要一些入门工具。
但是,我遇到了一些问题,如这个示例输出所示:
---
0: 42
---
1: 42
---
2: 42
---
3: 42
---
4: 42
...
我想要的是:
---
0: 42
1: 42
2: 42
3: 42
4: 42
...
这是生成它的代码:
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 ) 并发现了这一点:
// 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();
}
但我从这里所做的超出了我的范围。一方面,我可以做一些小改动,然后在将输出写入文件之前将所有 --- 从输出中删除(当然,第一个除外),但另一方面,我只是假设我一定忽略了一些细节可以更优雅地解决这个问题。
编辑:我的例子并没有证明 map 的合理性,所以我会进一步解释一下。我正在为大量图像存储一些元信息。当我读回它们时,我想直接访问每个图像的信息,即 myyaml[frame_id]["algorithm_2"]["result_x"] 其中 frame_id 可以是例如3. 如果每个图像在文件中都有自己的文档,我不知道如何执行此操作,除非每次查找都遍历整个文件。这些图像不一定是从 0 到 number_of_images 的连续序列。
编辑 2:关于 João Augusto 编辑过的答案,这里有一个更详细的例子,但它也不起作用:
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;
这是输出:
---
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]
...
其中仍然有不需要的新文档语句。我需要在我的代码中更改什么才能使它们不显示?
最佳答案
您应该阅读 yaml 格式的文档。您正在为每个项目创建一个 map ,您想要的是这样的东西。
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,所以如果你这样做:
---
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
...
例如,您可以通过以下方式访问 frame_3 中 algorithm_2 的值:
YAML::Node yaml = YAML::Load(res.c_str());
int value = yaml["frame_3"]["algorithm_2"].as<int>();
编辑...
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
关于c++ - Yaml-cpp:在发射器中的每个新 map 之前禁用自动 begindoc (---),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50346457/
是否可以在 yaml 中存储未转义的 Markdown 文档?我测试过 key:|+ markdown text block that could have any combination o
在解析使用两个空格缩进创建的 YAML(使用 Ruby 2.5/Psych)时,我看到了奇怪的行为。同一个文件,每行缩进四个空格 - 在我看来 - 正如预期的那样。 两个空格: windows:
如何在 yaml 文件中使用三元运算符让 snakeparser 解析它 我使用 groovy 来解析表达式,!e 标签帮助我这样做。现在,当我使用三元运算符时,解析器会失败。 name : abc
是否可以有这样的多行键? mykey: - > key one: keytwo: val 其中 keyone 被视为一个键。我想解析 yaml 以产生: { mykey:
我有一个 YAML 文件,它有几个不同的键,我想为其提供相同的值。此外,我希望该值易于配置。 请参阅下面的 YAML 以了解我的特定用例: --- # Options for attribute_va
在 Perl 中,我可以执行以下操作: my $home = "/home"; my $alice = "$home/alice"; 我可以在 YAML 中执行以下操作: Home: /home Al
如何在 YAML 中表示空字典? IE。它在语义上应该等同于空的 json-object {}。 最佳答案 简短回答:使用 {} 在 yaml 中有两种表示映射(字典)的方法; flow mappin
我需要根据 if 条件再添加一个名称。如果另一个 .yml 文件中的变量值为“yes”,则在列表中添加新名称 我的 yaml 文件中有以下代码: JsNames: - name: 'jquery.m
我是 yaml 新手,我对用于多行的管道符号 (|) 有疑问。 YAML 是否有类似下面的语法? test: |6+ 在下面的两个 YAML 文件中,第一个有效,第二个无效。我不知道是什么原因造成的。
关于 YAML specs关于问号有2.11段: A question mark and space (“? ”) indicate a complex mapping key. Within a b
1。摘要 我找不到如何自动美化我的 YAML 文件。 2。数据 示例: 我有 SashaPrettifyYAML.yaml 文件: sasha_commands: # Sasha comm
我试图理解 YAML 的基本概念。我没有找到任何相关文档可以消除我的疑虑。例如: product: - sku : BL394D quantity : 4
1。摘要 我找不到如何自动美化我的 YAML 文件。 2。数据 示例: 我有 SashaPrettifyYAML.yaml 文件: sasha_commands: # Sasha comm
是否有在 YAML 键中使用空格的正确方法?喜欢 a test: "hello world!" 或 "a test": "hello world!" 或者这只是一个坏主意,应该使用 a_test: "
我在 YAML 中遇到这个问题通过 perl 使用时。谁能告诉我哪里出了问题。 我有一个代码片段 use YAML; ... my $ifdef_struct = YAML::Load(': unde
我有一系列 OpenCv 生成的 YAML 文件,想用 yaml-cpp 解析它们 我在简单的事情上做得很好,但矩阵表示很困难。 # Center of table tableCenter: !!op
有没有办法在启动文件期间加载的 ROS yaml 文件中使用环境变量? 例如, 测试启动: 例子.yaml: vehicle_name: "${VEHICLE_NAME}_robot
Pandoc 支持 YAML metadata block在 Markdown 文档中。这可以设置标题和作者等。它还可以通过更改字体大小、边距宽度和赋予包含的图形的框架大小来操纵 PDF 输出的外观。
我使用当前(2013/12/12)最新版本的 yaml-cpp。 我注意到 YAML::Load("")和 YAML::Load("---\n...") 导致 Null 节点,即 YAML::Load
我喜欢 YAML。 等等,让我备份。我喜欢看起来像这样的 YAML,甚至比 JSON 还要多: Projects: C/C++ Libraries: - libyaml # "C"
我是一名优秀的程序员,十分优秀!