我正在用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
的位置。看起来您想读写实际的结构,因此您必须将它们直接放入数组中,而不是使用指针。