В комментарии вы написали:
Я хочу читать векторные целые числа, пока пользователь не нажмет 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