cin напрямую в вектор‹int›, разорвать цикл, когда больше нет данных

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

int main(int argc, char ** argv){
    int input;
    vector<int> intVector;
    while (cin >> input) 
        intVector.push_back(input);
    //print vector contents
    copy(intVector.begin(), intVector.end(), ostream_iterator<char>(cout, " ")); cout << "\n";

    return 0;
}

Я хочу как-то добавить простое, дополнительное условие в цикле while, которое проверяет конец строки, чтобы он не просто продолжал слушать бесконечно. cin.oef тут ни при чем. Я уже пробовал это и некоторые другие вещи.

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


person user2514676    schedule 05.07.2014    source источник
comment
Как насчет использования getline вместо >>?   -  person user3553031    schedule 05.07.2014
comment
как это будет выглядеть конкретно?   -  person user2514676    schedule 05.07.2014
comment
Пробовали ли вы en.cppreference.com/w/cpp/iterator/istream_iterator и en.cppreference.com/w/cpp/iterator/back_inserter?   -  person zahir    schedule 05.07.2014


Ответы (3)


Вы можете использовать sstream библиотеку:

#include <vector>
#include <string>
#include <sstream>
#include <iostream>
#include <iterator>
using namespace std;

int main(int argc, char ** argv) {

    string buf;

    while(getline(cin, buf)) {

        istringstream ssin(buf);
        vector<int> intVector;
        int input;
        while(ssin >> input) {
            intVector.push_back(input);
        }

        //print vector contents
        cout << intVector.size() << endl;
        copy(intVector.begin(), intVector.end(), ostream_iterator<int>(cout, " "));
        cout << "\n";
    }

    return 0;
}
person Alfred Huang    schedule 05.07.2014
comment
Соответствует ли это спецификациям? Что происходит при вводе 1 2\n3 4\n. Похоже, что обе строки будут обработаны вместо первой строки. - person jww; 17.09.2018

Как насчет

vector<int> intVector( std::istream_iterator<int>( std::cin ), 
                       std::istream_iterator<int>() );
person sbabbi    schedule 05.07.2014
comment
хороший! Не забудьте включить заголовок <iterator>. - person BugShotGG; 11.04.2016

Если вы хотите избежать ошибок, таких как вставка символа в целочисленную переменную, вы можете сделать:

while (some condition) {
  if (!(std::cin >> int_variable)) {
    std::cin.clear();
    std::cin.ignore(1024, '\n');
  } else {
    array.push_back(int_variable);
    // Anything else or increment the condition variable
  }
}
person Andrea Pirlo    schedule 19.06.2018