Re[3]: istream clear() не работает (не сбрасывает failbit)
От: Хитрик Денис Россия RSDN
Дата: 09.06.07 17:44
Оценка: +1
Здравствуйте, Astral29, Вы писали:

AA>>Наверное, тебе нужно просто clear().

A>Неа, я и так и сяк пробывал. Не работает

Нет, нужно именно просто cin.clear(). В том коде, что ты показал ты его не сбрасываешь, а сам повторно устанавливаешь.

Вообще же твоя проблема заключалась в том, что ты хотя и сбрасывал failbit, но не изменял содержимое потока! Неудавшаяся операция чтения целого числа не удаляет некорректные с её точки зрения символы из потока. Поэтому у тебя программа входила в бесконечный цикл: в потоке есть некорректные данные -> пытаемся прочитать их как чило -> исключение -> сбрасываем failbit -> снова считываем некорректные данные (те же самые!). Вот и всё.

Следовательно, в случае ошибки нужно очистить поток ввода, чтобы вводимые тобой символы попадали в чистый поток. А это можно сделать следующим образом:
    ... 
    if (cin.fail())
    {
        cout << "wrong data. enter again\n";
       cin.clear();
       cin.ignore(static_cast<streamsize>(numeric_limits<int>::max()), '\n');
        continue;
    }
    ...


Функция ignore у всех потоков ввода позволяет игнорировать всё текущее содержимое до тех пор, пока не встретится символ, передаваемый вторым параметром, но не более чем количество символов, указанное первым параметром.
В нашем случае символ — перевод строки.

Скобки забыл поставить после max — это функция! ДХ
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.