我正在學習如何使用C++和作爲一個初學者我有一些疑問,我想澄清文件的工作閱讀:標準循環從一個文本文件C++
在我的書作者介紹了流狀態和寫入這個簡單的代碼,以顯示如何讀取,直到我們達到文件或終止子的末端:
// somewhere make ist throw if it goes bad :
void fill_vector(istream& ist, vector<int>& v, char terminator)
{
ist.exceptions(ist.exceptions() | ios_base::badbit);
for (int i; ist >> i;) v.push_back(i);
if (ist.eof()) return; // fine: we found end of file
// not good() not bad() and not eof(), it must be fail()
ist.clear();
char c;
ist >> c; // read a character, hopefully terminator
if (c != terminator) { // not the terminator, so we must fail
ist.unget(); // maybe my caller can use that character
ist.clear(ios_base::failbit);
}
}
這是第一個例子,它提供了讀取數據的有用的方法,但我在第二個例子中遇到了一些問題,作者說:
通常情況下,我們要檢查我們的閱讀,因爲我們走,這是假設
ist
是「istream對象」的總體戰略:
for (My_type var; ist >> var;) { // read until end of file
// maybe check that var is valid
// do something with var
}
if (ist.fail()) {
ist.clear();
char ch;
// the error function is created into the book :
if (!(ist >> ch && ch == '|')) error("Bad termination of input\n");
}
// carry on : we found end of file or terminator
如果我們不想接受終止符 - 也就是說,只接受end o文件作爲結束 - 我們只需在調用error()之前刪除測試。
這裏是我的疑問:在第一個例子中,我們基本上是檢查的istream的每一個可能的狀態,以確保在閱讀終止我們想,這是很正常的。但我在理解第二個示例時遇到了問題:
作者在錯誤調用之前說刪除測試時意味着什麼?
- 是否有可能在閱讀時避免同時觸發eof和失敗?如果是,如何?
我真的很困惑,我無法理解的例子,因爲從我已經做了failbit總會eofbit後設置的測試,所以有什麼檢查failbit的意義,如果它會一直被觸發?作者爲什麼這麼做
我想我仍然困惑,我已經試過再次測試第二個例子來看看會發生什麼如果我決定在發生'fail'的情況下用'error()'拋出一個異常,問題是當我到達文件的末尾時,我會同時出現'fail'和'eof作爲'ist'的流狀態。我已經通過從文件中讀取10個整數直到'eof'來嘗試這個例子。 –
@PieroBorrelli你確定,因爲根據[docs](http://en.cppreference.com/w/cpp/io/basic_ios/fail),'eof'不是失敗。也許最後有一個無效的字符(空格?)? – Rakete1111
嘗試過其他例子後,我發現你是對的,我有一個文件以空白結尾。現在,如果我嘗試讀取一個沒有任何無效字符的文件,我會得到eof(),eof什麼時候會被準確觸發?當我達到文件的最後一個值時? –