2

我一直在这里阅读有关 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::ignore( ) 会忽略由某个数字指定的任何和所有字符,直到分隔符..

4

1 回答 1

7

input >> n;遇到非数字输入时,它会设置fail标志。代码检查它是否已设置 ( if (input.fail())),如果是,则忽略最多numeric_limits<streamsize>::max()字符,直到遇到换行符\n。实际上,这意味着遇到故障的行的其余部分将被忽略。

请注意,这仍会在行首读取一个数字,例如"25 asdasf". 但是,如果该行是"25 asdfasf 26"25,则将读取 25,但随后会发生故障并忽略该行的其余部分,包括末尾的 26。

于 2013-02-04T18:32:29.327 回答