2013-02-04 71 views
1

我一直在閱讀關於istream :: ignore()here。我認爲我瞭解它的功能的主要思想,但我看到了一些使用此功能的例子accepting only numeric input,我不確定它爲什麼起作用。istream :: ignore()如何工作?

爲什麼此代碼會忽略除數字輸入以外的所有內容?

#include <iostream> 
#include <sstream> 
#include <limits> 

int main() 
{ 
    std::istringstream input("1\n" 
          "some non-numeric input\n" 
          "2\n"); 
    for(;;) { 
     int n; 
     input >> n; 

     if (input.eof() || input.bad()) { 
      break; 
     } else if (input.fail()) { 
      input.clear(); // unset failbit 
      input.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip bad input 
     } else { 
      std::cout << n << '\n'; 
     } 
    } 
} 

我原以爲的IStream ::忽略()會忽略任何由一定數量的,直到定界符指定的所有字符..

+0

嗯,它會忽略所有字符,直到找到''\ n''。 –

+0

你最後一句描述了它。它會忽略儘可能多的字符,或者直到找到分隔符。你傳遞一個數字和一個分隔符。 – chris

+0

我鏈接的例子說,它跳過非數字輸入..因此,描述是錯誤的? – Ci3

回答

5

input >> n;遇到非數字輸入,它集fail標誌。代碼檢查是否設置了(if (input.fail())),如果是,則忽略最多numeric_limits<streamsize>::max()個字符,直到遇到換行符\n字符。實際上,這意味着遇到故障的其餘部分將被忽略。

請注意,這仍然會在像"25 asdasf"這樣的行的開頭讀取一個數字。但是,如果行是"25 asdfasf 26",則會讀取25行,但會發生故障,並忽略該行的其餘部分,包括最後的26行。

+0

這幫助我更好地理解它。謝謝! – Ci3