檢查迴圈條件內的檔案結尾是不好的做法
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