前几天写C++的文件输入输出,发现了关于EOF()函数的一个小问题,
Load readLoad;
fstream readFromFile;
//打开文件
readFromFile.open("Exercise12_6.dat",ios::in|ios::binary);
//如果这里用!input.eof()来判断文件的结尾,最后一个对象会重复输出
while(!readFromFile.eof())
{
input.read(reinterpret_cast<char *>(&load3),sizeof(Load));
display(readLoad);
}
readFromFile.close();
如果按照书本所说,直接用eof()判断文件指针是否到结尾,会导致,最后一个对象重复输出
这是因为判断文件是否结束的eof()函数是根据读入的字符判断的,
例如要读入的文件中包含两个字符:ab
正确的读入顺序是首先读入'a‘,
while(…)判断文件是否结束,
放进输出文件中,
然后读入'b',
while(…)判断文件是否结束,
放进输出文件中,
然后读入文件结束标志符,
while判断文件结束。
所以正确的做法是,用读出的对象来判断,就不会导致最后一个对象重复读出了,顺便一提,文件打开记得关闭,如下
Load readLoad;
fstream readFromFile;
//打开文件
readFromFile.open("Exercise12_6.dat",ios::in|ios::binary);
//如果这里用!input.eof()来判断文件的结尾,最后一个对象会重复输出
if(!(readFromFile.read(reinterpret_cast<char *>(&readLoad),sizeof(Load))))
{
cout << "文件'Exercise12_6.dat'内无任何数据" <<endl;
}
else
{
display(readLoad);
while(readFromFile.read(reinterpret_cast<char *>(&readLoad),sizeof(Load)))
{
//input.read(reinterpret_cast<char *>(&load3),sizeof(Load));
display(readLoad);
}
}
readFromFile.close();