почему порядок имеет значение?

почему это когда я ставлю 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;
}

1

Решение

cin.clear(); cin.ignore(10,'\n'); очищает флаги ошибок потока, чтобы сделать его снова читаемым, а затем пытается пропустить до 10 символов до конца строки.

cin.ignore(10,'\n'); cin.clear(); сначала пытается пропустить до 10 символов до конца строки (что приведет к сбою и ничего не делать, если поток находится в состоянии ошибки), а затем очищает флаги ошибок потока, чтобы сделать его снова читаемым. Затем вы обойдете цикл и снова попытаетесь прочитать плохо отформатированные данные, которые привели к его отказу в прошлый раз.

Если вопрос «почему я не могу использовать ignore отбрасывать данные из потока, который находится в состоянии ошибки «тогда, ну, вы просто не можете. Потоки предназначены для использования в том, что они переходят в состояние ошибки и сидят там, ничего не делая, пока вы не знаете, как исправить это и clear() они говорят, что вы игнорируете ошибку) или сдаться и выйти.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]