Злоупотребление cin in while циклами для присваивания int - PullRequest
2 голосов
/ 28 июля 2011

просто пытается сравнить два пользовательских вектора, чтобы увидеть, равны ли они, текущий код:

vector<int> ivec1, ivec2; //vectors, uninitialized

int temp1;

cout << "Enter integers to be stored in ivec1." << endl;

while(cin >> temp1) //takes input from user and creates new element in the vector to store it
{
    ivec1.push_back(temp1);
}

int temp2;

cout << "Enter integers to be stored in ivec2." << endl;

while(cin >> temp2) //same as above with different vector
{
    ivec2.push_back(temp2);
}

if(ivec1 == ivec2)
    cout << "ivec1 and ivec2 are equal!" << endl;
else
    cout << "ivec1 and ivec2 are NOT equal!" << endl;

Пока что это позволяет мне назначать значения ivec1 просто отлично, но когда я выхожу из цикла while, вводя букву для сбоя cin, он пропускает второй блок while. Из любопытства я попытался вставить другие операторы cin после первого цикла while, и он также игнорирует их все.

Вызывает ли принудительный сбой cin программу игнорировать все остальные вызовы или что-то в этом роде, или есть другая проблема? Если так, как я могу заставить эту программу делать то, что я хочу?

скриншот для вашего удовольствия от просмотра: http://img695.imageshack.us/img695/2677/cinfailure.png

* PS. имея temp1 и temp2, я просто пытался понять, вызывает ли проблема одно и то же значение int для обоих циклов присваивания, в любом случае, я решил, что оставлю это там

Ответы [ 5 ]

4 голосов
/ 28 июля 2011

Вам нужно будет сделать cin.clear(), чтобы сбросить состояние потока. Затем вам нужно будет убедиться, что нарушающий символ читается из потока (используя один из методов, описанных здесь ), чтобы следующая операция ввода также не завершилась.

1 голос
/ 28 июля 2011

Используйте cin.clear() между петлями. Эта команда сбрасывает состояние потока обратно в пригодное для использования.

Может быть полезно знать, что вам не всегда нужно вводить недопустимый символ для выхода из цикла, вы также можете использовать (на окнах) ctrl-z (ctrl-d на других системах) на консоли, что стимулирует EOF. Вам все равно придется cin.clear() (потому что EOF по-прежнему делает поток недействительным) - но это не так опасно

1 голос
/ 28 июля 2011

Вы имеете в виду, что вы делаете ctrl-D, чтобы задать конец файла для первого цикла.

Проблема в том, что как только EOF будет достигнут, он сохранится, и второй цикл также увидит EOF и никогда ничего не прочитает.

Вместо этого используйте завершающий символ, такой как пустая строка или «.» и специально проверить это в игрушечном цикле while вместо while (cin >> tmp1)

0 голосов
/ 28 сентября 2016

Я нашел это, когда работал над той же проблемой. Мне пришлось добавить cin.clear() и cin.ignore(), чтобы сбросить поток между циклами и заставить его снова распознавать вызовы 'cin'.

0 голосов
/ 28 июля 2011

Когда цикл первый while выходит из-за сбоя std::cin, он также устанавливает флаг сбоя внутри системы. Все, что вам нужно, чтобы очистить этот флаг, записав следующее после первого while цикла:

scin.clear();

Он сбрасывает все флажки сбоя, так что cin может использоваться для чтения дополнительных входных данных.

...