我遇到了一个问题,无法将二进制文件正确地读入我的结构体中。这个结构体如下:
struct Student
{
char name[25];
int quiz1;
int quiz2;
int quiz3;
};
这段代码占用了37个字节(来自字符数组的25个字节和每个整数的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为char),返回了K,这是75的ASCII码,即第一个测试成绩,所以一切都应该在正确的位置上。只是我的结构体没有被正确读入。如果有帮助,将不胜感激,我现在束手无策。
编辑:在收到大量意外和精彩的反馈后,我决定采纳你们的建议,一次只读取一个成员。通过使用函数,使代码更简洁、更小。再次感谢你们提供如此快速和有启发性的反馈。
如果你感兴趣 一种不被大多数人推荐的解决方法,请向下滚动到user1654209的第三个回答。这种解决方法可以完美地工作,但请阅读所有评论以了解为什么它不受欢迎。
sizeof(Student)
,你会发现它不是37个字节。它可能是40或56。 - Some programmer dude