2010-12-06 95 views
5

我有一个我想写入二进制文件的结构数组。我有一个write.c程序和一个read.c程序。 write.c程序似乎工作正常,但是当我运行read.c程序时,出现了分段错误。我是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; 
} 

感谢您的帮助!

+0

这个问题每天会被询问多少次?应该有一个'C'的常见问题解答,让我们指出答案,而不是花时间写下所有这些停顿的时间...... – KevinDTimm 2010-12-06 16:57:51

回答

5
struct Person* people; 

这只分配一个指向struct的指针,但是你没有为实际结构内容分配任何空间。要么使用malloc类似于你写程序,或者你可以试试:

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

您可能需要malloc内存为指针变量people你做fread,或(容易)之前只是直接读入一个局部变量:

struct Person people; 

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

您需要分配用于数据空间,你正在阅读:

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

一旦OP决定读取大于1的元素,这似乎更具可扩展性。可以在一个局部变量上循环。 – 2010-12-06 16:39:14

3

您需要先为该人分配记忆。将struct Person* people;更改为struct Person* people = malloc(sizeof(struct Person));。并且不要忘记最后释放你的记忆:free(people);

+0

你可以解释什么时候(struct Person *)意味着在malloc(sizeof(struct Person))之前?这是演员吗? – 2010-12-06 16:50:43