我有一个程序,它从/向二进制文件读/写记录,存储记录,然后执行搜索,排序,修改和打印等操作。我不能使用结构数组作为我的struct变量,因此用户可以输入任意数量的记录。我在阅读文件时遇到一些麻烦,这可能是由于我对read()函数的实际工作原理缺乏了解。我按字段写入文件字段并以相同的方式写入它们,以便它们相互镜像。
这些是我的结构:
struct Name{
char first[10];
char middle[10];
char last[10];
};
struct Date{
int day;
int month;
int year;
};
struct Grade{
int midterm;
int final;
int finalGrade;
float gpa;
};
struct Rank{ //ordered based on GPA
int rank;
};
struct Student{
int id;
Name name;
Date enroll;
Date graduate;
Grade grade;
Rank rank;
}student;
没有看到使用这些写入的任何问题(由于填充问题,所有这些都是逐字段写的,大多数都在这里省略):
out.write(student.name.last, sizeof(student.name.last));
out.write(reinterpret_cast<char*>(&student.enroll.month), sizeof(student.enroll.month));
//when I try to iterate through the file to read, I did this:
out.seekg(0);
while(!out.eof){
out.read(student.name.last, sizeof(student.name.last));
out.read(reinterpret_cast<char*>(&student.enroll.month), sizeof(student.enroll.month));
}
这是通过一个无限循环发送它,我不明白为什么会这样。在二进制文件中,eof“character”是否存在差异,它只是从未找到它,因为它真的在寻找其他东西?我只是读到使用这样的循环会导致问题(我切换到保持正在编写的记录数量的运行计数并设置for循环。
for(int i = 0; i < record_count; i++){//read}
我想避免这种方法。
就读取功能而言,它是如何工作的?我的印象是每个字段都进行了重新分配,并且每次读取student.name/whatever字段并打印出每条记录的信息时都要处理整个文件,但它似乎没有这样做,或者我错了。任何见解将不胜感激。