检查循环条件内的文件结尾是不好的做法
eof
仅在读取文件结尾后才返回 true
。它并不表示下一次读取将是流的结束。
while (!f.eof())
{
// Everything is OK
f >> buffer;
// What if *only* now the eof / fail bit is set?
/* Use `buffer` */
}
你可以正确地写:
while (!f.eof())
{
f >> buffer >> std::ws;
if (f.fail())
break;
/* Use `buffer` */
}
但
while (f >> buffer)
{
/* Use `buffer` */
}
更简单,更不容易出错。
进一步参考:
std::ws
:丢弃输入流中的前导空格std::basic_ios::fail
:如果关联流上发生错误,则返回true