Guardando la estructura en el archivo

Quiero guardar una matriz multidimensional en un archivo. Una estructura por ejemplo:

struct StructSub { unsigned short id; }; struct MyStruct { struct StructSub sub[3]; }; // Use the struct struct MyStruct main; int i = 0; while (i < 3) { main.sub[i].id = i; i++; } 

Para este ejemplo, quiero guardar los datos en un archivo en este formato (texto normal):

 MyStruct main { StructSub sub[0] { id = 0; } StructSub sub[1] { id = 1; } StructSub sub[2] { id = 2; } } 

¿Cuál es la forma más fácil de hacer esto?

Supongo que algo así es más lo que quieres. No es tan escueto como podría ser, pero es muy sencillo y se puede extender fácilmente para acomodar otras estructuras.

 void WriteIndent(FILE* file, int indent) { int i = 0; while (i < indent) { fprintf(file, "\t"); ++i; } } void WriteStructSub(FILE* file, StructSub* s, char* id, int indent) { WriteIndent(file, indent); fprintf(file, "StructSub %s {\n", id); WriteIndent(file, indent + 1); fprintf(file, "id = %i;\n", s->id); WriteIndent(file, indent); fprintf(file, "}\n"); } void WriteMyStruct(FILE* file, MyStruct* s, char* id, int indent) { WriteIndent(file, indent); fprintf(file, "MyStruct %s {\n", id); int i = 0; while (i < 3) { char name[7]; sprintf(name, "sub[%i]", i); WriteStructSub(file, &s->sub[i], name, indent + 1); ++i; } WriteIndent(file, indent); fprintf(file, "}\n"); } int main(int argc, char** argv) { MyStruct s; int i = 0; while (i < 3) { s.sub[i].id = i; ++i; } FILE* output = fopen("data.out", "w"); WriteMyStruct(output, &s, "main", 0); fclose(output); } 

Recuerde que guardar estructuras en bruto en un archivo como este no es portátil en absoluto. El comstackdor puede agregar relleno a la estructura (cambiar sizeof (your_struct)), endianness puede ser diferente, etc. Si esto es sin embargo, no importa, entonces fwrite () funciona bien.

Recuerde que si su estructura contiene algún puntero, desea escribir los datos a los que apunta el puntero, no el valor del puntero en sí.

Prueba esto

 struct StructSub { unsigned short id; }; struct MyStruct { struct StructSub sub[10]; }; // Use the struct struct MyStruct main; int i = 0; while (i < 10) { main.sub[i].id = i; } 

Escribir en el archivo

 FILE* output; output = fopen("Data.dat", "wb"); fwrite(&main, sizeof(main), 1, output); fclose(output); 

Leer archivo

 struct Data data; FILE* input; input = fopen("Data.dat", "rb"); fread(&main, sizeof(main), 1, input); // you got the data from the file! fclose(input); 

estos enlaces son compatibles con el código anterior: http://c-faq.com/struct/io.html

 fwrite(&somestruct, sizeof somestruct, 1, fp); 

Puede utilizar las bibliotecas de serialización disponibles que hacen esto.

Si puede usar C ++, hay una biblioteca Boost :: Serialization solo para eso. También te puede interesar pagar

  1. biblioteca s11n .
  2. Esta respuesta .
  3. Biblioteca de tpl .

Puedes usar fileio básico, solo asegúrate de escribir en binario .

 FILE * pFile; pFile = fopen( "structs.bin","wb" ); if ( pFile!=NULL ) { frwite( main, 1, sizeof(struct MyStruct), pFile ); fclose (pFile); } 

Sin embargo, si lo hace de esta manera, no es la plataforma más portátil, ya que hay que considerar la endianidad.

Aparte de que el nombre del objeto es main , lo que puede causar muchos problemas extraños: solo fuerza bruta, no hay mejor manera 🙂

 /* pseudo code */ write struct header foreach element write element header write element value(s) write element footer endfor write struct footer