1

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

ご覧のとおり、ハイペロンから始まり、疑問符があります。何が起こるかを確認するために、さらにエントリを追加してみました。と を交互に繰り返すよう?です:。これはかなり奇妙です。

Nucleons キーと Hyperons キーのすべての内容を削除しようとしましたが、まだこれが表示されます

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 構造は適切ですか? それとも別のものに修正する必要がありますか?ありがとう。

4

1 に答える 1

1

2つのキーと値のペアを持つ単一のマップが本当に必要な場合は、2つの連続するマップを単一のノードとして記述しています。具体的には(ここにあなたのコードの一部があります):

    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::KeyYAML::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;

つまり、2つのキーと値のペアを持つマップがあります。1つ目は、期待したものです(キーはfoo、で、値はマップです)。ただし、2番目の場合、キーはマップであり、値は提供されないため、として解釈されnullます。キーはマップであるため、その余分な。で指定された長い形式のキーである必要があります?

補足:e.size()出力文字列の長さを示すがあり、を使用する必要はありませんstrlen

于 2013-01-27T23:24:19.797 に答える