failbit
будет установлено после использования оператора извлечения, если произошла ошибка разбора, есть пара простых тестовых функций good
и fail
, которые вы можете проверить.Они в точности противоположны друг другу, потому что они обрабатывают eofbit
по-разному, но в этом примере это не проблема.
Затем вы должны очистить failbit
перед повторной попыткой.
Как говорит Касабланка, вы также должны отбросить нечисловые данные, оставшиеся во входном буфере.
Итак:
double x;
while (1) {
cout << '>';
cin >> x;
if (cin.good())
// valid number
break;
} else {
// not a valid number
cout << "Invalid Input! Please input a numerical value." << endl;
cin.clear();
cin.ignore(100000, '\n');
}
}
//do other stuff...