почему это когда я ставлю cin.clear()
затем cin.ignore()
программа работает без нареканий, например: я положил в chars
и программа не глючит.
но когда я положу cin.ignore()
будет первый cin.clear()
программа не прекращает посылать сигналы об ошибках.
как это работает?
не должен быть удален вход и fail flag
сняты с охраной?
#include <iostream>
using namespace std;
class time
{
private:
int hours;public:
void getime()
{
do
{
cout << "Enter hours: ";
cin >> hours;
if ( hours < 0 || hours > 23 || cin.fail() )
{
cin.clear();
cin.ignore(10,'\n');
cerr << "invalid time, minutes must be between 0 and 59 " << endl;}
}while(hours<0 || hours>23);
}
};
int main()
{
time asd;
asd.getime();
return 0;
}
cin.clear(); cin.ignore(10,'\n');
очищает флаги ошибок потока, чтобы сделать его снова читаемым, а затем пытается пропустить до 10 символов до конца строки.
cin.ignore(10,'\n'); cin.clear();
сначала пытается пропустить до 10 символов до конца строки (что приведет к сбою и ничего не делать, если поток находится в состоянии ошибки), а затем очищает флаги ошибок потока, чтобы сделать его снова читаемым. Затем вы обойдете цикл и снова попытаетесь прочитать плохо отформатированные данные, которые привели к его отказу в прошлый раз.
Если вопрос «почему я не могу использовать ignore
отбрасывать данные из потока, который находится в состоянии ошибки «тогда, ну, вы просто не можете. Потоки предназначены для использования в том, что они переходят в состояние ошибки и сидят там, ничего не делая, пока вы не знаете, как исправить это и clear()
они говорят, что вы игнорируете ошибку) или сдаться и выйти.
Других решений пока нет …