Vector C++ de objetos de clase a archivo\volver al programa

Espero poder utilizar mis datos durante cada reinicio de mi programa. Tengo curiosidad por cuál es la mejor manera de almacenar en un archivo que volver a leer en el programa. He estado leyendo algunas cosas en Internet y la gran pregunta es ¿formato XML o binario? Todavía estoy aprendiendo c ++, no lo domino. los objetos del programa son del tipo string int int ... ¿Qué forma me recomiendan usar y por qué?

Una cosa más, ¿alguien sabe un buen tutorial para esto? to binary or to XML?

Lo siento por la parte del código que falta, pero quería saber algunas opiniones de programadores más avanzados que yo. :PAGS

preguntado el 22 de mayo de 12 a las 13:05

De lo que estás hablando es de "persistencia de objetos". Busque en esos términos y es posible que encuentre algo útil. Sin embargo, en general, la industria ha preferido formatos no binarios como XML, JSON o YAML porque se pueden editar y no tienen dependencias binarias de la plataforma, como el tamaño de int o ordenamiento de bytes. -

3 Respuestas

Además del comentario de Matthais:

Creo que el formato más obvio es el correcto en su caso, y es solo texto sin formato.

Simplemente serialice sus datos en texto sin formato (a menudo delimitado por espacios). El beneficio de PT es que es legible por humanos, modificable por humanos, fácil de procesar usando flujos (>> tokenización o boost tokeniser) y flexible y es mucho más liviano que XML.

Por ejemplo, es posible que desee almacenar

struct {
    std::string name;
    int age;
    double height;
};

usted simplemente escribiría:

John 21 5.4
Bill 31 4.9

o lo que sea que tengas. Esto siempre es conveniente, por ejemplo, el nombre podría contener dos palabras, por lo que:

John Smith

Y el tokenizador se dividiría en espacios e intentaría analizar a smith como un int, pero ese es un problema fácil de solucionar usando delimitadores. Tal como ""

contestado el 22 de mayo de 12 a las 13:05

¿De qué tokenizador estás hablando? ¿Podrías decirme la función/biblioteca de C++? - bogdan m

Las desventajas del texto sin formato son 1) tiene que escribir el analizador, 2) es difícil expandirlo más tarde y 3) la recuperación de errores es más difícil. - mike de simone

@MikeDeSimone, solo tiene que escribir un análisis si la estructura es compleja, y la mayoría de los analizadores son bastante fáciles de escribir. 2). No más difícil que binario, quizás más difícil que XML 3). pero es posible, buena suerte explicando al usuario por qué su XML o datos binarios son incorrectos. - 111111

No estoy de acuerdo. Hay muchas opciones disponibles. Te nombro dos más aquí: 1) Puedes buscar un formato de archivo llamado json que tiene un sitio web propio (algunos de nosotros no lo tenemos). Afirma ser un formato ligero de intercambio de datos. 2) Hay un formato de archivo llamado csv. El uso del cual ya se discutió en stackoverflow aquí

contestado el 23 de mayo de 17 a las 11:05

Solo use CSV si "Quiero editar esto en Excel o equivalente" es una característica importante. - mike de simone

¿Necesita un comportamiento robusto incluso cuando su proceso se cierra prematuramente (por ejemplo, debido a un corte de energía, una falla de hardware o un error grave dentro de su propio código)?

Si es así, considere una base de datos "incrustada" como SQLite o MS SQL Server Compact (etc.). La naturaleza transaccional de estos sistemas debería garantizar que no pueda terminar con datos corruptos, lo que luego evitaría que su programa se inicie correctamente.

Además, algunos sistemas de archivos admiten transacciones (por ejemplo, NTFS transaccional en Windows Vista o posterior).

contestado el 22 de mayo de 12 a las 13:05

Esto parece interesante pero la complejidad es un poco más alta de lo que esperaba. Usé Json en Python. no sabía que es para c++ también gracias por informarme. :) - bogdan m

Diría que "Necesito trabajar con muchos más datos de los que cabe razonablemente en la memoria, y hacer muchas referencias cruzadas sobre ellos" es una razón mucho mejor para usar bases de datos que "robustez". - mike de simone

@MikeDeSimone Bueno, todas estas son razones válidas en general, pero la redacción de la pregunta sugiere que ni el tamaño ni la necesidad de "referencias cruzadas" son un problema en esta circunstancia particular. Y mencioné el sistema de archivos transaccionales como alternativa. - branco dimitrijevic

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.