3

我正在用 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 数组中的所有内容,这样我们就可以有一个干净的状态来读取文件。

4

3 回答 3

2

我相信而不是

Student *Data[30];

你要

Student Data[30];

因为第一个是指针数组,而第二个是你想要的结构数组。

当你写

fread(&Data, sizeof(Student), count, file);

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

于 2013-03-26T17:50:52.653 回答
1

如果 Data 确实是指向您的结构的指针数组,那么您要保存的只是指针,而不是您的实际数据。实际上,您永远不应该保存实际指针,因为下次运行时,malloc 可能会返回不同的指针来存储您的数据。

为了保存,您想要做的是迭代您的数组并将实际的结构数据写入文件,例如:

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

为了恢复,您需要遍历学生、malloc 存储并读取结构,然后设置数据指针,例如:

for (i = 0; i < numberOfStudents; i++) {
    Student *p = malloc(sizeof (Student));
    fread(p, sizeof (Student), 1, file);
    Data[i] = p;
}

此外,通常,您应该检查 fopen、fread、fwrite 和 fclose 的返回值以检测错误。

于 2013-03-26T18:23:53.563 回答
1

我认为这是罪魁祸首:

Student *Data[30];

这是一个指向Student结构的指针数组。没有为实际分配的存储空间Students

删除*, 在您似乎正确使用的其余代码中,Data就好像它是一个普通数组一样,因此它不需要修改。

在不相关的注释上编辑,您可以在同一语句中声明结构及其别名,如下所示:

typedef struct {
    ...
} Student;
于 2013-03-26T17:51:41.767 回答