2016-05-31 17 views
0

我正在學習如何使用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的每一個可能的狀態,以確保在閱讀終止我們想,這是很正常的。但我在理解第二個示例時遇到了問題:

  1. 作者在錯誤調用之前說刪除測試時意味着什麼?

    1. 是否有可能在閱讀時避免同時觸發eof和失敗?如果是,如何?

我真的很困惑,我無法理解的例子,因爲從我已經做了failbit總會eofbit後設置的測試,所以有什麼檢查failbit的意義,如果它會一直被觸發?作者爲什麼這麼做

回答

1

如果我在作者說的錯誤調用之前刪除測試,代碼會發生什麼情況?這不會是無用的,因爲我只會檢查流的錯誤狀態?

我想我明白你的意思了。不,這不是沒用,因爲你會告訴某人(我不知道error實際上做了什麼),程序員(例外)或用戶(標準輸出),數據有一些無效數據,並且有人必須採取行動因此。

它可能沒用,但取決於你想要的功能,如果你想讓它默默地忽略錯誤並使用已經處理過的正確數據,那真的是沒用。

我怎樣才能從一個文件中讀取數據,直到我沒有使用任何其他終止符到達該文件的末尾?

我不明白你的意思,你已經在做,在這兩個例子:

if (ist.eof()) return; // fine: we found end of file 

if (ist.fail()) { //If 'ist' didn't fail (reaching eof is not a failure), just skip 'if' 
+0

我想我仍然困惑,我已經試過再次測試第二個例子來看看會發生什麼如果我決定在發生'fail'的情況下用'error()'拋出一個異常,問題是當我到達文件的末尾時,我會同時出現'fail'和'eof作爲'ist'的流狀態。我已經通過從文件中讀取10個整數直到'eof'來嘗試這個例子。 –

+0

@PieroBorrelli你確定,因爲根據[docs](http://en.cppreference.com/w/cpp/io/basic_ios/fail),'eof'不是失敗。也許最後有一個無效的字符(空格?)? – Rakete1111

+0

嘗試過其他例子後,我發現你是對的,我有一個文件以空白結尾。現在,如果我嘗試讀取一個沒有任何無效字符的文件,我會得到eof(),eof什麼時候會被準確觸發?當我達到文件的最後一個值時? –