/ / Cómo guardar [x, y] en el archivo yaml - yaml, yaml-cpp

Cómo guardar [x, y] en el archivo yaml - yaml, yaml-cpp

En archivo .yaml. Sé cómo guardar x, y en

world:

radius: 20
x: -70
y: -30

Mi pregunta es ¿Puedo guardarla en el siguiente formato?

world:

radius: 20
[-30, -70]

Básicamente, quiero almacenar dos números flotantes (x, y) en una línea.

Yo programo en c ++

Respuestas

1 para la respuesta № 1

No, no puedes, no en la forma en que lo describiste. Puede probarlo fácilmente pegando su salida requerida en un analizador YAML en línea (por ejemplo, esta uno) o, si tiene instalado Python, instalando virtualenv y do:

pip install ruamel.yaml.cmd
yaml round-trip input.yaml

Su salida requerida tiene, en el nivel superior, una asignación con clave world, para lo cual el valor comienza siendo un mapeo (con clave radius y valor 20) luego cambia a una secuencia de estilo de flujo: [-30, -70]. Eso es incorrecto, no puede mezclar pares de clave-valor de mapeo con secuencias.

Hay varias maneras de corregir esto. Tu puedes hacer:

world:
radius: 20
[-30, -70]:

que está perfectamente bien YAML, la pareja. -30, -70 ser una clave para un valor null lo que no debe hacerse explícito. Tenga en cuenta que algunos analizadores de YAML no son compatibles con este formulario, al que yo vinculé.

La, IMO, la solución más lógica de una línea:

world:
radius: 20
[x, y]: [-30, -70]

que puede obtener compilando y ejecutando:

#include <iostream>
#include "yaml-cpp/yaml.h"

int main()
{
YAML::Emitter out;
out << YAML::BeginMap;
out << YAML::Key << "world";
out << YAML::Value << YAML::BeginMap;
out << YAML::Key << "radius";
out << YAML::Value << 20;
out << YAML::Key << YAML::Flow << YAML::BeginSeq << "x" << "y" << YAML::EndSeq;
out << YAML::Key << YAML::Flow << YAML::BeginSeq << "-30" << "-70" << YAML::EndSeq;

std::cout << out.c_str() << "n";
return 0;
}

Tu primer ejemplo de YAML tampoco es válido YAML: debes alinear las claves y no los dos puntos en una asignación:

world:

radius: 20
x: -70
y: -30

¹ Descargo de responsabilidad: Soy el autor de la ruamel.yaml.cmd paquete. El uso de una prueba local puede ser importante si su archivo YAML contiene datos confidenciales.


1 para la respuesta № 2

Al emitir una secuencia, puedes prefaciarla con YAML::Flow. Desde el documentación:

YAML::Emitter out;
out << YAML::Flow;
out << YAML::BeginSeq << 2 << 3 << 5 << 7 << 11 << YAML::EndSeq;

produce

[2, 3, 5, 7, 11]