Запись массива структур в двоичный файл на C - PullRequest
5 голосов
/ 06 декабря 2010

У меня есть массив структур, которые я хотел бы записать в двоичный файл. У меня есть программа write.c и программа read.c. Программа write.c, кажется, работает правильно, но когда я запускаю программу read.c, я получаю ошибку сегментации. Я новичок в 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;
}

Спасибо за помощь!

Ответы [ 4 ]

5 голосов
/ 06 декабря 2010
struct Person* people;

Это выделяет только указатель на структуру, но у вас нет выделенного пространства для реального содержимого структуры. Либо используйте malloc аналогично вашей программе записи, либо попробуйте что-то вроде:

struct Person people;
fread(&people, sizeof(people), 1, data);
3 голосов
/ 06 декабря 2010

Сначала нужно выделить память для человека.Измените: struct Person* people; на struct Person* people = malloc(sizeof(struct Person));.И не забудьте освободить память в конце: free(people);.

1 голос
/ 06 декабря 2010

Вам необходимо выделить место для данных, которые вы читаете:

people = malloc(sizeof(*people)*numPeople);
1 голос
/ 06 декабря 2010

Вам необходимо malloc памяти в переменную-указатель people перед выполнением fread, или (проще) просто прочитать непосредственно в локальную переменную:

struct Person people;

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