我正在用 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 时它变为零,但加载根本不起作用。如果我的程序中的学生数组为零,那么当我调用 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 数组中的所有内容,这样我们就可以有一个干净的状态来读取文件。