我正在尝试将一个结构二进制写入文件,然后使用第二个元素初始化另一个结构。 当我在函数内部定义FILE * fptr时,它工作良好,但是如图所示从外部传递文件时,我在fread()函数中收到了段错误。为什么会发生?预先感谢您的帮助!
typedef struct Person
{
int id;
char name[30];
int age;
}Person;
int ex3(FILE *fptr);
int main()
{
FILE *fptr;
return ex3(fptr);
}
int ex3(FILE *fptr)
{
Person personArr1[] = {{1, "Seinfeld", 29},
{2, "George", 32},
{3, "Elain", 28}};
Person *singlePerson;
unsigned int i;
/* write struct into file */
if (!(fptr = fopen(FILE1, "wb+")))
{
fprintf(stderr, "COULD NOT WRITE INTO FILE. ABORT.");
return ERR_CODE;
}
fwrite(&personArr1, sizeof(Person), sizeof(personArr1) / sizeof(personArr1[0]), fptr);
fclose(fptr);
if (!(fptr = fopen(FILE1, "rb+")))
{
fprintf(stderr, "COULD NOT WRITE INTO FILE. ABORT.");
return ERR_CODE;
}
/* go into second element position */
fseek(fptr, sizeof(Person), SEEK_SET);
/* initalize new struct values */
fread(singlePerson, sizeof(Person), 1, fptr);
fclose(fptr);`enter code here`
printf("%d %s %d\n", singlePerson->id, singlePerson->name, singlePerson->age);
return 0;
}
答案 0 :(得分:2)
singlePerson
没指向任何地方:
Person *singlePerson;
...
fread(singlePerson, sizeof(Person), 1, fptr);
因此fread
正在尝试读取和取消引用未初始化的指针。这会调用undefined behavior,在您的情况下,它有时显示为崩溃,但其他情况并非如此。
这里不需要指针。只需将singlePerson
声明为Person
的实例并传递其地址即可。
Person singlePerson;
...
fread(&singlePerson, sizeof(Person), 1, fptr);
答案 1 :(得分:0)
有很多问题:
FILE *fptr; // here fptr points nowhere
return ex3(fptr);
您将无效的指针传递到ex3
,然后在那里取消引用ith。但是在fptr
之外声明ex3
毫无意义。
singlePerson
从未初始化,它指向任何地方。您可能想要这样:
Person singlePerson;
代替
Person *singlePerson;
并像这样呼叫fwrite
:
fread(&singlePerson, sizeof(Person), 1, fptr);