2010-12-06 87 views
5

J'ai un tableau de structures que je voudrais écrire dans un fichier binaire. J'ai un programme write.c et un programme read.c. Le programme write.c semble fonctionner correctement mais lorsque j'exécute le programme read.c, j'obtiens une erreur de segmentation. Je suis nouveau à C donc ce serait génial si quelqu'un pouvait regarder sur mon code pour des erreurs évidentes. Je vous promets que ce n'est pas trop long :)Ecriture d'un tableau de structures dans un fichier binaire 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; 
} 

Merci pour l'aide!

+0

Combien de fois par jour cette question est-elle posée? Il devrait y avoir une FAQ 'C' qui nous permettra de pointer vers la réponse plutôt que de passer le temps à écrire tout ce temps après le temps ...... – KevinDTimm

Répondre

5
struct Person* people; 

Cela alloue juste un pointeur vers struct, mais vous n'avez aucun espace alloué pour le contenu struct réel. Soit utiliser malloc de façon similaire à votre programme d'écriture, ou essayer quelque chose comme:

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

Vous devez soit malloc mémoire dans le pointeur de variable people avant de faire le fread, ou (plus facile) de lire directement dans une variable locale:

struct Person people; 

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

vous devez allouer de l'espace pour les données que vous lisez dans:

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

Cela semble plus extensible une fois que OP a décidé de lire> 1 élément . Pourrait boucle sur une seule variable locale à la place. –

3

Vous devez d'abord affecter la mémoire à la personne. Changer: struct Person* people; en struct Person* people = malloc(sizeof(struct Person));. Et n'oubliez pas de libérer votre mémoire à la fin: free(people);.

+0

Pouvez-vous expliquer quand la (struct Person *) signifie avant le malloc (sizeof (struct Person))? Est-ce un casting? –

+0

@ jjacquay712 Oui c'est. J'aime juste ne pas trop relayer les options du compilateur par défaut. –

+1

Veuillez ** ne pas ** afficher le résultat de 'malloc'. C'est un comportement C standard et bien défini, et C idiomatique pour le laisser de côté. Vous avez la garantie d'obtenir une distribution implicite. Si vous lancez le cast, le compilateur n'est plus capable de diagnostiquer l'erreur si vous oubliez de "#include ". –