检查循环条件内的文件结尾是不好的做法

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` */
}

更简单,更不容易出错。

进一步参考: