Я использую 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();
}
но то, что я делаю отсюда, за мной. С одной стороны, я мог бы сделать небольшой взлом и просто удалить все --- из вывода, прежде чем записать его вфайл (кроме первого, конечно), но с другой стороны, я просто предполагаю, что я, должно быть, упустил некоторые детали, которые решат эту проблему более элегантно.
Правка: Мой примерне оправдывает карту, поэтому я объясню немного подробнее. Я храню метаинформацию для большой коллекции изображений. Когда я читаю их обратно, я хотел бы получить доступ к информации для каждого изображения напрямую, т.е.myyaml [frame_id] ["алгоритма_2"] ["result_x"], где frame_id может быть, например, 3Я не знаю, как это сделать, если у каждого изображения есть собственный документ в файле, если не считать итерации по всему файлу для каждого поиска.Изображения не обязательно в непрерывной последовательности от 0 до number_of_images.
Edit 2: В отношении отредактированного ответа Жоао Аугусто вот более сложный пример, которыйтакже не работает:
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]
...
, который все еще содержит нежелательные новые операторы документа.Что мне нужно изменить в моем коде, чтобы они не появлялись?