После прочтения неверного значения cin находится в состоянии «сбой».Вы должны сбросить это.
Вы должны очистить флаг ошибки и очистить буфер.таким образом:
cin.clear();
cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
Второй вызов «очищает» входной буфер любых данных, которые могут быть там, чтобы подготовить вас к следующему вызову «cin».
Если вы окажетесьзаписав эти 2 строки «по всему вашему коду», вы можете написать простую встроенную функцию, чтобы заменить ее.
inline void reset( std::istream & is )
{
is.clear();
is.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
}
Хотя я заставил эту функцию принимать любой поток, большую часть времени он будет использоваться только дляcin
, где пользователь вводит и вводит что-то недопустимое.Если это неверный файл или ввод строки, нет способа исправить это, и вам лучше всего просто выбросить исключение.