Почему это вставка? (вопросительный знак) прямо перед вводом карты?

Yaml-cpp, кажется, вставляет вопросительный знак прямо перед моей записью на карте. Это результат:

baryons:
nucleons:
- proton:
quarkContent: [u, u, d]
charge: 1
- antiproton:
quarkContent: [au, au, ad]
charge: -1
- neutron:
quarkContent: [d, d, u]
charge: 0
- antineutron:
quarkContent: [ad, ad, au]
charge: 0
? hyperons:
- lambda:
quarkContent: [u, d, s]
charge: 0
- antilambda:
quarkContent: [au, ad, as]
charge: 0

Как видите, начиная с гиперонов, стоит знак вопроса. Я попытался добавить больше записей, чтобы увидеть, что происходит. Кажется, чередуются между ? а также :, Это довольно странно.

Я попытался удалить все содержимое ключа нуклонов и ключа гиперонов, и я все еще получаю это

baryons:
nucleons:
- Hello
? hyperons:
- Hello

Ммм. довольно странно, действительно. Вот мой код Прости беспорядок

#include "yaml-cpp/yaml.h"#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
#include <typeinfo>
using namespace YAML;

void addParticle(Emitter * e, std::string name, std::string qc1, std::string qc2, std::string qc3, int charge){
*e << BeginMap << Key << name;
*e << Value;
*e << BeginMap;
*e << Key << "quarkContent" << Value << Flow << BeginSeq << qc1 << qc2 << qc3 << EndSeq;
*e << Key << "charge" << Value << charge;
*e << EndMap;
*e << EndMap;

*e << BeginMap << Key << "anti" + name;
*e << Value;
*e << BeginMap;
*e << Key << "quarkContent" << Value << Flow << BeginSeq << "a" + qc1 << "a" + qc2 << "a" + qc3 << EndSeq;
*e << Key << "charge" << Value << charge * -1;
*e << EndMap;
*e << EndMap;
};

int main(){
Emitter e;

e << BeginMap;
e << Key << "baryons";
e << Value;

e << BeginMap;
e << Key << "nucleons";
e << Value;
e << BeginSeq;
addParticle(&e, "proton", "u", "u", "d", 1);
addParticle(&e, "neutron", "d", "d", "u", 0);
e << EndSeq;
e << EndMap;

e << BeginMap;
e << Key << "hyperons";
e << Value;
e << BeginSeq;
addParticle(&e, "lambda", "u", "d", "s", 0);
e << EndSeq;
e << EndMap;

e << EndMap;

std::ofstream particlesYAML;
particlesYAML.open("particles.yml");
particlesYAML.write(e.c_str(), strlen(e.c_str()));
particlesYAML.close();
return 0;
};

С другой стороны, я хочу уменьшить помехи. Так что прости это тоже.

Кроме того, хороша ли моя структура YAML? Или я должен пересмотреть что-то другое? Благодарю.

1

Решение

Вы пишете две последовательные карты как один узел, когда вам действительно нужна одна карта с двумя парами ключ / значение. В частности (вот фрагмент вашего кода):

    e << BeginMap;
e << Key << "nucleons";
e << Value;
e << BeginSeq;
addParticle(&e, "proton", "u", "u", "d", 1);
addParticle(&e, "neutron", "d", "d", "u", 0);
e << EndSeq;
// you previously had a EndMap and BeginMap
e << Key << "hyperons";
e << Value;
e << BeginSeq;
addParticle(&e, "lambda", "u", "d", "s", 0);
e << EndSeq;
e << EndMap;

Причина, по которой yaml-cpp дает вам такую ​​дополнительную ?вместо того, чтобы просто дать ошибку, это то, что вам на самом деле не нужно предоставлять YAML::Key или же YAML::Value, Ваш код выглядит так:

e << YAML::BeginMap;
e << YAML::Key << "foo";  // specifies the key
e << YAML::Value;
e << YAML::BeginMap;      // specifies the value
// stuff
e << YAML::EndMap;
e << YAML::BeginMap;      // specifies a new key (the YAML::Key is implied)
// stuff
e << YAML::EndMap;
// no value is provided for that key
e << YAML::EndMap;

Итак, у вас есть карта с двумя парами ключ / значение. Во-первых, это то, что вы ожидали (ключ fooи значение является картой). Для второго, однако, ключ карта и значение не указано, поэтому оно интерпретируется как null, Поскольку ключ является картой, он должен быть длинным ключом, который обозначается этим дополнительным ?,

Примечание: есть e.size() это дает вам длину выходной строки, поэтому вам не нужно использовать strlen,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]