2010-12-06 19 views
5

Tengo una matriz de estructuras que me gustaría escribir en un archivo binario. Tengo un programa write.c y un programa read.c. El programa write.c parece funcionar correctamente, pero cuando ejecuto el programa read.c recibo un error de segmentación. Soy nuevo en C, por lo que sería genial si alguien pudiera revisar mi código para detectar cualquier error obvio. Prometo que no es demasiado largo :)Escribir una matriz de estructuras en un archivo binario en C

write.c:

#include <stdlib.h> 
#include <stdio.h> 

struct Person 
{ 
    char f_name[256]; 
    char l_name[256]; 
    int age; 
}; 

int main(int argc, char* argv[]) 
{ 
    struct Person* people; 
    int people_count; 

    printf("How many people would you like to create: "); 
    scanf("%i", &people_count); 
    people = malloc(sizeof(struct Person) * people_count); 

    int n; 
    for (n = 0; n < people_count; n++) 
    { 
     printf("Person %i's First Name: ", n); 
     scanf("%s", people[n].f_name); 

     printf("Person %i's Last Name: ", n); 
     scanf("%s", people[n].l_name); 

     printf("Person %i's Age: ", n); 
     scanf("%i", &people[n].age); 
    } 

    FILE* data; 
    if ((data = fopen("data.bin", "wb")) == NULL) 
    { 
     printf("Error opening file\n"); 
     return 1; 
    } 

    fwrite(people, sizeof(struct Person) * people_count, 1, data); 
    fclose(data); 

    return 0; 
} 

read.c:

#include <stdlib.h> 
#include <stdio.h> 

struct Person 
{ 
    char f_name[256]; 
    char l_name[256]; 
    int age; 
}; 

int main(int argc, char* argv[]) 
{ 
    FILE* data; 
    if ((data = fopen("data.bin", "rb")) == NULL) 
    { 
     printf("Error opening file\n"); 
     return 1; 
    } 

    struct Person* people; 

    fread(people, sizeof(struct Person) * 1/* Just read one person */, 1, data); 
    printf("%s\n", people[0].f_name); 

    fclose(data); 

    return 0; 
} 

Gracias por la ayuda!

+0

¿Cuántas veces al día se hace esta pregunta? Debería haber una pregunta frecuente 'C' que nos permita señalar la respuesta en lugar de perder el tiempo escribiendo todo esto una y otra vez ... – KevinDTimm

Respuesta

5
struct Person* people; 

Esto asigna solo un puntero a struct, pero no tiene ningún espacio asignado para el contenido de la estructura real. O bien utilizar malloc de manera similar a su programa de escritura, o intentar algo como:

struct Person people; 
fread(&people, sizeof(people), 1, data); 
1

o hay que hacer malloc de memoria en el puntero variable de people antes de hacer la fread, o (más fácil) acaba de leer directamente en una variable local:

struct Person people; 

fread(&people, sizeof(struct Person) * 1/* Just read one person */, 1, data); 
1

es necesario asignar espacio para los datos que está leyendo en:

people = malloc(sizeof(*people)*numPeople); 
+0

Esto parece más extensible una vez que OP decide leer> 1 elemento . Podría bucle en una única variable local en su lugar. –

3

Primero debe asignar memoria a la persona. Cambio: struct Person* people; en struct Person* people = malloc(sizeof(struct Person));. Y no se olvide de liberar su memoria al final: free(people);.

+0

¿Puedes explicar cuándo (struct Person *) significa antes del malloc (sizeof (struct Person))? ¿Eso es un elenco? –

+0

@ jjacquay712 Sí lo es. Simplemente me gusta no transmitir demasiado sobre las opciones de compilación predeterminadas. –

+1

Por favor ** no ** arroje el resultado de 'malloc'. Es un comportamiento C estándar y bien definido, y C idiomático para dejarlo fuera. Usted tiene la garantía de obtener un elenco implícito. Si lo haces, el compilador ya no podrá diagnosticar el error si olvidas '#include '. –

Cuestiones relacionadas