2009-02-27 16 views
7

¿cómo se podría escribir el contenido de una estructura en C++ en un archivo de texto? Lo que quiero hacer es decir, tengo una estructura llamada A, con los miembros de datos A.one, A.wo, y así sucesivamente, y quiero escribirlos línea por línea en un archivo de texto, comovolcando estructuras de C++ en un archivo de texto

Estructura a
A.one = valor
a.Dos = valor ...

Estructura B
B.one = valor
B.two = valor

Básicamente quiero hacer un basurero ... ¿Hay alguna manera fácil de hacer esto? ¿Cuál es el mejor método de E/S para esto? ¿CFile? iostream? Gracias. ¿Hay una forma más fácil de volcar todos los valores de los datos de miembros de una clase?


EDIT: Mierda, gracias chicos ..

+0

relacionadas: * [http://stackoverflow.com/questions/234724/how-to-serialize-in-c](http://stackoverflow.com/questions/234724/how-to -serializar-en-c) * [http://stackoverflow.com/questions/523872/how-do-you-serialize-an-object-in-c](http://stackoverflow.com/questions/523872/how-do-you-serialize-an-object-in-c) – dmckee

Respuesta

8

No se reflejo en C++, así que hay que hacerlo de forma manual, por ejemplo (usando iostream, por simplicty):

dump_A(std::cout, "A", a); 

void dump_A(std::iostream& os, const char* name, A const& a) 
{ 
    os << "Structure " << name << '\n' 
     << name << ".one = " << a.one << '\n' 
     << name << ".two = " << a.two << '\n'; 
} 
5

C++ no es introspectiva. Es decir, no sabe nada sobre el contenido de sus estructuras. Tienes que usar algún tipo de anotación manual o un sistema de reflexión para hacer esto.

Por supuesto, si está de acuerdo con la información de hardcoding sobre las estructuras, puede volcar la información con cualquier método de E/S.

Por ejemplo:

struct A 
{ 
    int member1; 
    char member2; 
}; 

void PrintA (const A& a) 
{ 
    std::printf ("member1: %d\n", a.member1); 
    std::printf ("member2: %c\n", b.member2); 
} 

Como se puede ver que esto es tedioso, ya que requiere un profundo conocimiento de la estructura, y no se actualiza automáticamente si se cambia la estructura. Pero la sobrecarga de un sistema de reflexión para hacer esto "correctamente" puede ser una desventaja, especialmente si estás aprendiendo.

+0

¿Quizás el uso de las clases de E/S estándar de C++ sería más seguro aquí? Si se cambian los tipos de member1 y member2, su código funcionará incorrectamente. – okutane

+0

No uso C++ stream IO como una cuestión de preferencia. Tiene razón de que sería marginalmente más seguro en este caso, pero el punto es que el código requiere una actualización cuidadosa para mantenerse al mismo paso con la definición de estructura, lo que es cierto independientemente del esquema de IO que prefiera. –

0

Esto se aplica más a C que en C++, pero hay que tener en cuenta que si usted escribe una estructura directamente al archivo (o un búfer de red), entonces el resultado será dependiente de la máquina y del compilador. Los enteros se escribirán en el orden de bytes del host y los bytes del compilador para la estructura también se incluirán. Intentar leer el búfer en una máquina con diferente endianidad o diferentes directivas de compilación no funcionará

Esto sucedería con algo así como (sea indulgente con la sintaxis): write (f, & A, sizeof (A));

0

SI esto es sólo una estructura , una llanura de edad tipo de datos compatible con C, con NO métodos virtuales y NO punteros, a continuación, como kludge corto plazo que sólo podría utilizar:

struct Foo { int a, b; char c, d, e[50]; } f; 
write(fd, & f, sizeof(f)); 

Sin embargo, no espere que esto sea multiplataforma, o incluso revisiones de compilador cruzado en la misma plataforma.

I think I've discussed this before...

+0

¿Qué significa fd en write (fd, ....)? ¿Es eso el manejo del archivo? tiene algunos punteros en él .. =/ – krebstar

+0

fd == descriptor de archivo, como se obtiene de open(). Si está utilizando un ARCHIVO * (desde fopen), podría usar fwrite(). –

Cuestiones relacionadas