私は 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 配列にあるものをすべてクリアするだけなので、ファイルを読み取るための白紙の状態にすることができます。