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

#c #vector #cin

#c #вектор #cin

Вопрос:

Следующий код выполняется и сохраняет входные данные в векторе, как и должно быть, но бесконечно повторяет цикл, прослушивая входные данные. Цель состоит в том, чтобы взять строку 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 здесь бесполезно. Я уже пробовал это и несколько других вещей.

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

Комментарии:

1. Как насчет использования getline вместо >> ?

2. как бы это выглядело конкретно?

3. Вы пробовали en.cppreference.com/w/cpp/iterator/istream_iterator и en.cppreference.com/w/cpp/iterator/back_inserter ?

Ответ №1:

Как насчет

 vector<int> intVector( std::istream_iterator<int>( std::cin ), 
                       std::istream_iterator<int>() );
  

Комментарии:

1. отличная идея! Не забудьте включить <iterator> заголовок.

Ответ №2:

Вы можете использовать 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;
}
  

Комментарии:

1. Соответствует ли это спецификациям? Что происходит с вводом 1 2n3 4n . Похоже, что вместо первой строки будут обработаны обе строки.

Ответ №3:

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

 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
  }
}