功能内的FILE *行为更改

时间:2019-05-03 14:38:34

标签: c

我正在尝试将一个结构二进制写入文件,然后使用第二个元素初始化另一个结构。 当我在函数内部定义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;
    }

2 个答案:

答案 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);