Wie mehrere Folgen von Zahlen einlesen?



  • Guten Abend

    Ich bin gerade etwas verwirrt mit dem Input über std::cin in C++. Ich habe z.B. folgenden zeilenweisen Keyboard-Input:

    3
    1 3 3 -234 2 3
    1 3 3 -21
    - 1 3 3 393 2 1 3 -3

    Die 3 gibt die Anzahl der Folgen an. Die Länge einer einzigen Zahlenfolge ist unbekannt. Ich möchte deshalb jede Folge in einem std::vector<int> speichern können.

    Wie mache ich das am besten? Ich habe schon ein par Dinge ausprobiert aber die haben irgendwie nicht geklappt 😕



  • Generell: jede Zeile einzeln einlesen und sie dann getrennt parsen. Die Zeilen bekommst du mit getline , danach hilft dir sicherlich ein istringstream . Die zwei Streams sind zwar performancetechnisch eher suboptimal (im Vergleich zu Parserlösungen), aber wohl erstmal am einfachsten zu coden.



  • Für getline müsste ich dann allerdings ein char-Array verwenden, nicht? Das wäre schon nicht so toll.

    Ich schau mal was ich hinbekomme.

    Danke für die Antwort.



  • icarus2 schrieb:

    Für getline müsste ich dann allerdings ein char-Array verwenden, nicht? Das wäre schon nicht so toll.

    Ich schau mal was ich hinbekomme.

    Danke für die Antwort.

    Nein, es gibt eine globale Version für std::string : getline().



  • mit dem 'is_endl' aus diesem Thread geht das recht elegant und ohne lästiges getline

    #include "is_endl.h" // s. <http://www.c-plusplus.net/forum/p1940874#1940874>
    #include <iostream>
    #include <vector>
    
    int main()
    {
        using namespace std;
        int n;
        if( cin >> n >> ws )
        {
            vector< vector< int > > alle(n);
            for( vector< vector< int > >::iterator i = alle.begin(); i != alle.end(); ++i )
                for( int z; !is_endl( cin ) && cin >> z ; )
                    i->push_back( z );
            cout << "fertig" << endl;
        }
        return 0;
    }
    

    Gruß
    Werner



  • Ich habs heute in kurzer Zeit hinbekommen. War wohl nicht mein Tag gestern ^^ Hatte vergessen, dass es eine Überladung von getline mit cin und std::string gibt.

    Danke für eure Antworten.



  • Werner Salomon:
    Was findest Du an getline lästig außer dass nicht deine patentierte is_endl™-Lösung verwendet wird? 🙂



  • frisst das is_endl eigentlich sowohl linux als auch windows als auch Mac Endlines ('\n' vs. "\r\n" vs. '\r')? Oder erledigt das der Filestream bereits?



  • Eisflamme schrieb:

    Was findest Du an getline lästig [...]

    Die Aufgabe war 'Zahlen zu lesen'

    icarus2 schrieb:

    3
    1 3 3 -234 2 3
    1 3 3 -21
    - 1 3 3 393 2 1 3 -3

    [...] Zahlenfolge [...] in einem std::vector<int> speichern [...]

    'getline' liest aber keine Zahlen.

    Gruß
    Werner



  • padreigh schrieb:

    frisst das is_endl eigentlich sowohl linux als auch windows als auch Mac Endlines ('\n' vs. "\r\n" vs. '\r')? Oder erledigt das der Filestream bereits?

    wenn alles 'gemäß Standard' zugeht, sollte das die codecvt-Facette im streambuf erledigen. Vorausgesetzt, Du öffnest die Datei nicht im binary-Mode.

    Gruß
    Werner


Anmelden zum Antworten