[英]Whitespace at end of file causing EOF check to fail in C++
我正在從具有三列的文件中讀取數據。 例如,數據將如下所示:
3 START RED
4 END RED
要讀取數據,我正在使用以下檢查:
while (iFile.peek() != EOF) {
// read in column 1
// read in column 2
// read in column 3
}
我的問題是循環通常會執行額外的循環。 我很確定這是因為很多文本編輯器似乎在實際內容的最后一行之后放置了空白行。
我做了一些谷歌搜索,然后在SO上進行搜索,發現了一些類似的情況,例如從文本文件讀取直到EOF重復最后一行,但是我似乎不太願意采用給出的解決方案來解決我的問題。 有什么建議么?
EOF不是預測,而是錯誤狀態。 因此,您不能像現在使用它那樣使用它來預測是否可以讀取第1、2和3列。因此,C ++中的常見模式是:
while (input >> obj1 >> obj2) {
use(obj1, obj2);
}
所有operator>>(istream& is, T&)
返回輸入流,並且在布爾上下文中使用時,只要最后一次提取成功,該流就為“ true”。 這樣可以安全地使用提取的對象。
假設iFile
是一個istream
:
您應該避免出現任何錯誤,而不僅僅是EOF(可以使用iFile.eof()
,BTW進行檢查),因為這是一個無休止的循環,當任何格式失敗將流設置為錯誤狀態時,這是一個無限循環。 EOF。 通常,在讀取完所有內容之后(無論成功與否),以及在輸入之前,都需要在循環的中間中斷讀取循環。
為了確保不再有任何有趣的事情,您可以在循環后重置流狀態,然后嘗試僅讀取空白,直到達到EOF:
while( !iFile.eof() )
{
iFile >> std::ws;
string line;
std::getline(iFile,line);
if(!line.empty()) error(...);
}
如果任何讀取失敗(您在其中讀取列數據),只需打破while循環即可。 大概您就在文件末尾並讀取最后一個“不正確”行
也許您會認為處理空白和其他無效輸入是個好主意。 也許需要對第1、2、3列進行一些基本驗證。
不必擔心循環的次數:只需驗證數據並處理無效的輸入即可。
基本上,請檢查是否有三列要閱讀,以及是否由於文件已結束或其他問題而不確定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.