我正在编写一个从二进制文件读取和写入的程序, 我的问题是虽然文件(例如)中有3个结构,但它会读取最后一个结构两次。 这是我的代码:
结构:
struct PARTICEPENTS
{
char id1[10];
char name1[11];
char id2[10];
char name2[11];
int points;
};
写作:
void EnterParticipants()
{
ofstream PartFile;
int i=1;
PARTICEPENTS part;
string temp="";
PartFile.open("part.bin",ios::out|ios::binary);
if(!PartFile){return;}
cout<<endl<<endl <<"Enter 3 Participants:"<<endl;
cout<<endl;
while(i<=3)
{
cout<<"the "<<i<<" couple"<<endl;
cout << "\tInsert the first id: " ;
getline(cin, temp);
strcpy(part.id1,stToChar(temp));
cout << "\tInsert the first name: ";
getline(cin, temp);
strcpy(part.name1,stToChar(temp));
cout << "\tInsert the second id:";
getline(cin, temp);
strcpy(part.id2,stToChar(temp));
cout << "\tInsert the second name:" ;
getline(cin, temp);
strcpy(part.name2,stToChar(temp));
part.points=0;
PartFile.write((char*)(&part), sizeof(part));
i++;
}
PartFile.close();
}
读数:
void DisplayFile()
{
ifstream PartFile;
PartFile.open("part.bin",ios::in|ios::binary);
PARTICEPENTS filePart;
if(!PartFile){return;}
while(!PartFile.eof())
{
PartFile.read((char*)(&filePart), sizeof(filePart));
cout<<left<<setw(12)<<filePart.id1<<left<<setw(12)<< filePart.name1
<<left<<setw(12)<<filePart.id2<<left<<setw(12)<<filePart.name2<<
left<<setw(7)<< filePart.points <<endl;
}
}
当我进入时:
111111111 Kim 111111111 Lori
222222222 Roy 222222222 Tom
333333333 Guy 333333333 Don
屏幕输出为:
111111111 Kim 111111111 Lori 0
222222222 Roy 222222222 Tom 0
333333333 Guy 333333333 Don 0
333333333 Guy 333333333 Don 0
我不知道为什么在最后一个结构之后读取没有停止。 谢谢你的帮助。 (抱歉我的英语不好......)
答案 0 :(得分:3)
while(!PartFile.eof())
{
PartFile.read((char*)(&filePart), sizeof(filePart));
cout<<left<<setw(12)<<filePart.id1<<left<<setw(12)<< filePart.name1
<<left<<setw(12)<<filePart.id2<<left<<setw(12)<<filePart.name2<<
left<<setw(7)<< filePart.points <<endl;
}
这里的问题是你正在读三个条目,但你尚未到达文件的末尾(当你读第三个时它是下一个条目)。第四次进入循环时,会到达文件末尾。
然后是
PartFile.read((char*)(&filePart), sizeof(filePart));
尝试将eof读入filePart
并失败,因此没有读入任何内容。这意味着它仍将包含来自第三个循环的数据。这将再次显示。
您可以通过在显示数据之前确保PartFile.read
成功来解决此问题。
while(PartFile.read((char*)(&filePart), sizeof(filePart)))
{
// PartFile.read((char*)(&filePart), sizeof(filePart));
cout<<left<<setw(12)<<filePart.id1<<left<<setw(12)<< filePart.name1