2013-02-04 42 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