Почему второй цикл cin пропускается через некоторое время (цикл cin) терпит неудачу? - PullRequest
0 голосов
/ 07 октября 2019

Этот код получает последовательность целых чисел, используя цикл while(cin>>x).

Переменная x возвращается на каждой итерации к vector<int> ivec.

Циклы должны выходить при нецелочисленном вводе.

После этого я хочу получить еще одинцелое число cin>>y, чтобы проверить его частоту. внутри вектора.

Код:

cout << "Enter a sequence of integers separated with a space: " << flush;
vector<int> ivec;
int x = 0, y = 0;
while( (cin>>x) && (cin.good()) )
{
    ivec.push_back(x);
}

cin.clear();

cout << "Enter an integer to count it's frequency: "<< endl;
cin>>y;

cout << "Y: " <<y<< " X: "<<x << endl;
cout << "Occurred "<< count(ivec.cbegin(), ivec.cend(), y)<< " times."<< endl;

for( int i : ivec)
{
    cout << " "<<i << flush;
}
cout << endl;

Проблема:

Когда я ввожу последовательность целых чисел ипоследний символ - eof, цикл while завершается, а второй cin>>y никогда не выполняется. Но остальная часть программы выполняется нормально. только больше cin операторов не могут быть выполнены.

Единственный случай, когда выполняется второй cin: если я введу последовательность целых чисел, разделенных пробелом, нажмите клавишу возврата, а затем введите eof (^ Z) на линии самостоятельно. Я не знаю, почему это так?

Что я пробовал:

Я пробовал cin.clear(), это не решает проблему.

Также я использовал auto stat = cin.rdstate() до цикла while и cin.setstate(stat) после цикла, пока второй cin никогда не выполняется.

ScreenShot: ScreenShot

Я знаю cin игнорирует пробел, табуляцию и новую строку, так почему новая строка имеет значение?

Я спрашиваю, как работает cin и почему еговести себя таким образом. Я знаю, что могу использовать getline ().

...