Здравствуйте, 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 — это функция! ДХ