Я хочу использовать cin после чтения ввода с оператором istream - PullRequest
0 голосов
/ 14 мая 2019

Я использую istream_iterator, чтобы читать целые числа из входных данных (до eof) и сохранять их в векторе

после этого я хочу прочитать одно целое число (или, может быть, значение другого типа, например, строку). Как я могу это сделать?

  • Должен ли я использовать cin (может быть, "очистить" это как-то)? я должен использовать уже созданный istream_iterator?

«проблемный» код следующий. Он не читает значение с помощью cin.

#include<iostream> 
#include<iterator>
#include<algorithm>
#include<vector>
using namespace std;

int main(){
// creates two iterators to the begin end end of std input
istream_iterator<int> int_it(cin), eof;

vector<int> int_vec(int_it,eof);


// prints the vector using iterators
cout<<"You gave me the vector: ";
copy(int_vec.begin(),int_vec.end(),ostream_iterator<int>(cout," "));
cout<<endl;

int value;
cout<<"Give me the value you want to search for: ";
cin>>value;

int x=count(int_vec.begin(),int_vec.end(),value);
cout<<"Value "<<value<<" is found "<<x<<" times\n";
}

1 Ответ

1 голос
/ 14 мая 2019

В комментарии вы написали:

Я хочу читать векторные целые числа, пока пользователь не нажмет ctrl-D (eof). Затем я хочу повторно использовать cin для чтения других вещей.

Вы не можете этого сделать. После закрытия std::cin / stdin его нельзя открыть для чтения из него дополнительных данных.

Вы можете использовать другую стратегию, хотя. Вместо того, чтобы полагаться на EOF для определения конца ввода для вектора целых чисел, вы можете использовать что-то, что не является целым числом. Например, если ваш ввод состоит из

1 2 3 4 end

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

Обновленная версия вашей программы

#include <iostream> 
#include <iterator>
#include <algorithm>
#include <vector>
#include <limits>

using namespace std;

int main()
{
   // creates two iterators to the begin end end of std input
   cout << "Input some integers. Enter something else to stop.\n";
   istream_iterator<int> int_it(cin), eof;
   vector<int> int_vec(int_it, eof);

   // prints the vector using iterators
   cout<<"You gave me the vector: ";
   copy(int_vec.begin(),int_vec.end(), ostream_iterator<int>(cout," "));
   cout << endl;

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

   int value = 0;
   cout << "Give me the value you want to search for: ";
   cin >> value;

   int x = count(int_vec.begin(), int_vec.end(), value);
   cout << "Value " << value << " is found " << x << " times\n";
}

Консольный ввод и вывод

Input some integers. Enter something else to stop.
1 2 3 4 end
You gave me the vector: 1 2 3 4
Give me the value you want to search for: 1
Value 1 is found 1 times
...