вопрос относительно cin.clear () - PullRequest
0 голосов
/ 20 августа 2011

Я просто работаю над книгой Ускоренный C ++.(Моя проблема находится на стр. 57, если у вас, ребята, есть книга с вами)

Проблема в следующем: у нас есть функция, которая читает оценки учеников:

...
while (in >> x) {    // in and x are defined as an istream& and as a double
    hw.push_back(x);    // hw is vector defined as vector<double>&
}
in.clear();
...

СейчасВ книге, а также на cplusplus.com указано, что функция clear сбрасывает все состояния ошибок и что вход снова готов для чтения некоторого ввода.Проблема в том, что если я поставлю:

int a = 0;
cin >> a;
cout << a << endl;

после функции, то она перескочит cin и просто выдаст мне 0. Понял ли я функцию cin.clear () совершенно неправильно или что я могу сделатьчтобы снова активировать cin.

Поскольку до того, как я прочитал книгу, у меня возникла та же проблема, я знаю, что тогда решил эту проблему со следующей строкой:

    cin.ignore( numeric_limits<streamsize>::max(), '\n');

Конечно, мне тогда приходится нажимать дополнительную клавишу ввода, но она съедает все то, что было раньше, и это заставляет cin не работать.

Дело в том, что ни .clear, ни .ignore не работают должным образом, но используютони оба вместе, я могу ввести что-то для переменной а;

РЕДАКТИРОВАТЬ: Хорошо, вот весь код.Это то, что я написал сам, чего нет в книге.

istream& in = cin; 
int var = 0;
vector<int> vec;
while ( in >> var ) { 
    vec.push_back(var); 
}
for (int f = 0; f < vec.size(); ++f) {
    cout << vec[f] << endl;
}
cin.clear();
cout << "cleared" << endl;
    int a = 0;
    cin >> a;
    cout << a << endl;

Ответы [ 2 ]

3 голосов
/ 20 августа 2011

Вызов clear очищает состояние ошибки, установленное при неудачном чтении. Он ничего не делает с символами, которые могут присутствовать во входном потоке.

Если состояние ошибки является результатом невозможности прочитать двойное число, вполне вероятно, что следующий символ также потерпит неудачу как целое число.

Если вы попробуете

char ch;
cin >> ch;

Я уверен, что это будет работать лучше.

В противном случае вам придется ignore несколько символов, чтобы избавиться от нечитаемого ввода.

2 голосов
/ 20 августа 2011

Цикл while в вашем примере кода считывает целочисленные значения до конца ввода или возникновения ошибки при чтении, например, давая символ, который не может встречаться в виде целой цифры, например «q».

Когда произошла ошибка, у вас может быть шанс восстановиться после этой ошибки, вызвав clear(), а затем удалив нарушающий символ из буфера ввода cin:

char dummy;
cin >> dymmy;

Затем вы можете прочитать int снова.

...