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は読み取られますが、失敗が発生し、最後の26を含む行の残りの部分は無視されます。

于 2013-02-04T18:32:29.327 に答える