因此,我遇到了一些问题,即无法将二进制文件正确读取到我的结构中。结构是这样的:
struct Student
{
char name[25];
int quiz1;
int quiz2;
int quiz3;
};
它是 37 个字节(25 个字节来自 char 数组,每个整数 4 个字节)。我的 .dat 文件是 185 字节。它是 5 名学生,有 3 个整数成绩。所以每个学生占用 37 个字节(37*5=185)。
它在纯文本格式中看起来像这样:
Bart Simpson 75 65 70
Ralph Wiggum 35 60 44
Lisa Simpson 100 98 91
Martin Prince 99 98 99
Milhouse Van Houten 80 87 79
我可以使用以下代码单独读取每条记录:
Student stud;
fstream file;
file.open("quizzes.dat", ios::in | ios::out | ios::binary);
if (file.fail())
{
cout << "ERROR: Cannot open the file..." << endl;
exit(0);
}
file.read(stud.name, sizeof(stud.name));
file.read(reinterpret_cast<char *>(&stud.quiz1), sizeof(stud.quiz1));
file.read(reinterpret_cast<char *>(&stud.quiz2), sizeof(stud.quiz2));
file.read(reinterpret_cast<char *>(&stud.quiz3), sizeof(stud.quiz3));
while(!file.eof())
{
cout << left
<< setw(25) << stud.name
<< setw(5) << stud.quiz1
<< setw(5) << stud.quiz2
<< setw(5) << stud.quiz3
<< endl;
// Reading the next record
file.read(stud.name, sizeof(stud.name));
file.read(reinterpret_cast<char *>(&stud.quiz1), sizeof(stud.quiz1));
file.read(reinterpret_cast<char *>(&stud.quiz2), sizeof(stud.quiz2));
file.read(reinterpret_cast<char *>(&stud.quiz3), sizeof(stud.quiz3));
}
而且我得到了一个漂亮的输出,但我希望能够一次读取一个完整的结构,而不仅仅是一次读取每个结构的单个成员。这段代码是我认为完成任务所需要的,但是......它不起作用(我将在它之后显示输出):
*不包括打开文件和结构声明等类似部分。
file.read(reinterpret_cast<char *>(&stud), sizeof(stud));
while(!file.eof())
{
cout << left
<< setw(25) << stud.name
<< setw(5) << stud.quiz1
<< setw(5) << stud.quiz2
<< setw(5) << stud.quiz3
<< endl;
file.read(reinterpret_cast<char *>(&stud), sizeof(stud));
}
输出:
Bart Simpson 16640179201818317312
ph Wiggum 288358417665884161394631027
impson 129184563217692391371917853806
ince 175193530917020655191851872800
它唯一没有搞砸的部分是名字,之后它就在山下。我已经尝试了一切,但我不知道出了什么问题。我什至翻遍了我拥有的书籍,但我找不到任何东西。那里的东西看起来像我所拥有的并且它们工作,但出于某种奇怪的原因我的没有。我在第 25 个字节处执行了 file.get(ch)(ch 是一个字符),它返回了 K,它是 75 的 ASCII ......这是第一个测试分数,所以,一切都在它应该在的地方。只是没有正确阅读我的结构。
任何帮助将不胜感激,我只是坚持这个。
编辑: 在收到你们这么多出乎意料和令人敬畏的意见后,我决定接受你们的建议,坚持一次只读一个成员。我通过使用函数让事情变得更干净、更小。 再次感谢您提供如此快速和启发性的意见。非常感谢。
如果您对大多数人不推荐的解决方法感兴趣,请向下滚动到 user1654209 的第三个答案。该解决方法完美无缺,但请阅读所有评论以了解为什么它不受欢迎。