Метод ios :: clear () фактически заменяет биты состояния управления потоком своим аргументом. Вы устанавливаете cin
состояние управления на fail
каждый раз, когда вы выдаете cin.clear(istream::failbit);
.
Вы должны просто позвонить cin.clear();
, без аргументов. Это сбросит состояние управления потоком на good
.
РЕДАКТИРОВАТЬ: Боже мой, я забыл.
Вам также необходимо вызвать istream :: ignore () , чтобы отменить неверный x
токен, который вы только что ввели, поскольку clear()
не сбрасывает ожидающий ввод:
if (cin.fail()) {
cerr << "bad data, try again\n";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
continue;
}