использование объекта C ++ IO istream для чтения приводит к бесконечному циклу - PullRequest
2 голосов
/ 24 декабря 2009

Приведенная ниже функция приводит к бесконечному циклу , если в качестве ввода введена строка.

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;
    }



}

Приведенная ниже функция приводит к бесконечному циклу , если в качестве ввода введена строка.

OUTPUT :

попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте снова снова плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные , попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте еще раз плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные, попробуйте снова плохие данные,

Ответы [ 3 ]

1 голос
/ 24 декабря 2009

Вам нужно сделать две вещи:

1) очистить состояние как здесь: cin.clear(istream::goodbit);

2) пропустить один символ за раз после очистки состояния, потому что вы не знаете, где начинается следующее число:

 char c;
 cin >> c;
0 голосов
/ 24 декабря 2009

Плохие данные все еще находятся во входном потоке? Если это так, может помочь что-то подобное:

    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
    }
0 голосов
/ 24 декабря 2009

Да, цикл действительно бесконечный. Посмотрите на cin.clear ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...