cin директно към vector‹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 lib:

#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