使用C ++ IO istream对象进行读取会导致无限循环

时间:2009-12-24 09:05:23

标签: c++ io

如果输入字符串作为输入,则以下函数会导致无限循环。

istream & inputFunc(istream &is)
{
   int ival;
    // read cin and test only for EOF; loop is executed even if there are other IO failures
    while (cin >> ival, !cin.eof()) {
        if (cin.bad())         // input stream is corrupted; bail out
            throw runtime_error("IO stream corrupted");
        if (cin.fail()) {                        // bad input
            cerr<< "bad data, try again";        // warn the user
            cin.clear(istream::failbit);         // reset the stream
            continue;                            // get next input
        }
        // ok to process ival
        cout << "you entered: " << ival << endl;
    }



}

如果输入字符串作为输入,则以下函数会导致无限循环。

输出

再试一次数据,再试一次数据,再试一次数据,再试一遍数据,再试一遍数据,再试一遍数据,再试一次数据,再试一遍数据,再试一遍数据,再试一遍数据,再试一次数据,再试一次数据,再试一次数据,再试一次数据,再试一次数据,再试一次数据,再试一次数据,再试一遍数据,再试一次数据,再试一遍数据,再试一遍数据,

3 个答案:

答案 0 :(得分:1)

你需要做两件事:

1)清除状态如下:cin.clear(istream::goodbit);

2)清除状态后一次跳过一个字符,因为你不知道下一个数字的开始位置:

 char c;
 cin >> c;

答案 1 :(得分:0)

是的,它确实无限循环。看看cin.clear()。

答案 2 :(得分:0)

坏数据是否仍然位于输入流中?如果是这样,这样的事情可能会有所帮助:

    if (cin.fail()) {                        // bad input
        string badData;                      // create a string to hold the bad input
        cin.clear(istream::failbit);         // reset the stream
        cin >> badData;                      // read the bad input to clear the stream
        cerr<< "bad data: " << badData << ", try again"; // warn the user
        continue;                            // get next input
    }