[eof](<http://en.cppreference.com/w/cpp/io/basic_ios/eof>) returns true only after reading the end of file. It does NOT indicate that the next read will be the end of stream.

while (!f.eof())
{
  // Everything is OK

  f >> buffer;

  // What if *only* now the eof / fail bit is set?

  /* Use `buffer` */
}

You could correctly write:

while (!f.eof()) 
{  
  f >> buffer >> std::ws;

  if (f.fail())
    break;

  /* Use `buffer` */
}

but

while (f >> buffer)
{
  /* Use `buffer` */
}

is simpler and less error prone.

Further references: