我正在用C语言创建一个学生数据库。最后我需要能够将我创建的数据库读写到文件中。因此,我已经有了一个指向学生结构的完整指针数组,并且需要将其写入文件。编写完之后,我还需要能够将其读回到数组中。

我真的不知道该怎么做。这是我的结构:

typedef struct student Student;
struct student
{
    char name[300];
    int age;
    char course1[300];
    char course2[300];
    char remarks[300];
};

Student *Data[30];

这些是我编写的用于处理文件的功能:
void writeDisk()
{
    FILE *file = fopen("disk.dat", "ab");
    fwrite(&Data, sizeof(Student), count, file);
    fclose(file);
}

void loadDisk()
{
    FILE *file = fopen("disk.dat", "rb");
    if (file != NULL)
    {
        fread(&Data, sizeof(Student), count, file);
        fclose(file);
    }
}

void emptyDisk()
{

    FILE *file = fopen("disk.dat", "rw");
    fopen("disk.dat", "wb");

}

我可以看到disk.dat文件的大小在写入时发生了变化,当我调用empty时它变为零,但是加载根本无法进行。如果程序中的Student数组为零,则在调用load并尝试显示它时它保持在零,但是如果数组中有东西,则在调用load并尝试显示它时出现分段错误。

我可能完全错了。我真的不确定自己在做什么。我以为我可以将整个数组写到文件中,但是我不确定那是真的。我只是想知道是否有人可以看这个,让我知道我要去哪里错了。

编辑

我已经编辑了代码,如下所示:
void writeDisk()
{
    int i = 0;
    FILE *file = fopen("disk.dat", "ab");

    for(i; i <count; i++)
    {
        fwrite(Data[i], sizeof(Student), 1, file);
    }

    fclose(file);
}

void loadDisk()
{
    char buffer[300];
    int i = 0;

    clearData();

    FILE *file = fopen("disk.dat", "rb");
    while(Data[i] != NULL)
{
    Data[i] = malloc(sizeof(Student));
    fread(Data[i], sizeof(Student), 1, file);
    i++;
}

    fclose(file);
}

这仍然不起作用。编写工作似乎更好,但是我看不到将学生的年龄写到文件中。加载文件中的clearData()函数仅清除Data数组中的所有内容,因此我们可以使用干净的方式将文件读入其中。

最佳答案

我相信代替

Student *Data[30];

你要
Student Data[30];

因为第一个是指针数组,而第二个是所需结构的数组。

当你写
fread(&Data, sizeof(Student), count, file);

它从文件中直接将数据读取到Data的位置。看起来您想读写实际的结构,因此您必须将它们直接放入数组中,而不是使用指针。

08-05 10:21
查看更多