Zweite Spalte aus einer Datei einlesen



  • Hallo,

    ich habe eine Datei die bei der ich jeden Eintrag die zweite Spalte als ein Integer einlesen möchte. Ich habe die Antwort von hier

    http://stackoverflow.com/questions/5738882/read-input-separated-by-whitespaces-or-newline

    probiert, aber da bekomme ich die Fehlermeldung

    variable ‘std::istringstream iss’ has initializer but incomplete type
    


  • #include <sstream>
    


  • Warum verwendest Du istringstream, wenn Du aus einer Datei liest? Da scheint etwas grundlegendes falsch zu sein.



  • vielleicht ließt er Zeile für Zeile, und erstellt dann aus jeder Zeile einen istringstream und diese einzeln zu parsen



  • Hallo, nun habe ich es geschafft die Einträge einzelt auszulesen und zu speichern.

    std::string dummystring;
        int someint;
    
        getline (myfile,line);
        std::stringstream ss(line);
        ss>>dummystring>>someint;
        std::cout<<dummystring<<" "<<someint<<'\n';
    

    Mit

    ss.str( std::string());
    ss.clear();

    soll man den stringstream auch löschen können. Wie kann ich aber die nächste Zeile wieder in den ss stream umleiten?



  • Mit ss.str( std::string() ); setzt du den string vom stringstream auf einen leeren. Wenn du da wieder die nächste Zeile stehen haben willst musst du dort die Zeile übergeben. Aber wieso machst du es nicht einfach so wie es bei stackoverflow steht? Mit der while Schleife und dem Erstellen des stringstreams in der Schleife?



  • sebi707 schrieb:

    Mit ss.str( std::string() ); setzt du den string vom stringstream auf einen leeren. Wenn du da wieder die nächste Zeile stehen haben willst musst du dort die Zeile übergeben. Aber wieso machst du es nicht einfach so wie es bei stackoverflow steht? Mit der while Schleife und dem Erstellen des stringstreams in der Schleife?

    Hallo sebi 😉 ,

    also ich dachte es ist effizienter alles in einen stringstream zu schreiben als immer wieder einen neuen aufzumachen, aber wo du mich auf das Beispiel bei stackoverflow hingewiesen hast, spielt es vermutlich nicht so eine große Rolle


  • Mod

    Wenn wir schon von Effizienz sprechen: Wir haben hier das klassische Stream -> String -> Stream -> Daten. Wieso nicht Stream -> Daten?



  • SeppJ schrieb:

    Wenn wir schon von Effizienz sprechen: Wir haben hier das klassische Stream -> String -> Stream -> Daten. Wieso nicht Stream -> Daten?

    Ja wenn du verrätst wie man die x-te Spalte einlesen kann ohne den Stringstream dazwischen, würde ich es gerne so in der Zukunft machen.


  • Mod

    Namal schrieb:

    SeppJ schrieb:

    Wenn wir schon von Effizienz sprechen: Wir haben hier das klassische Stream -> String -> Stream -> Daten. Wieso nicht Stream -> Daten?

    Ja wenn du verrätst wie man die x-te Spalte einlesen kann ohne den Stringstream dazwischen, würde ich es gerne so in der Zukunft machen.

    Zeig' uns das Format deiner Datei. Der dummy String ist höchstwahrscheinlich nicht nötig, da einfach alle Zeichen die kein Leerraum sind, übersprungen werden können.

    PS: Der gewöhnliche Weg ist es, einen Stringstream als Zwischenmedium erst als letzte Wahl zu betrachten. Warum war es deine erste?


  • Mod

    Selbst ohne dein Format zu kennen wird die Lösung ohne unnötige Zwischenschritte ungefähr so aussehen:

    // Dein jetziger Code:
    getline(file, line);
    stringstream str(line);
    // irgendwelche Operationen auf str
    

    Neuer Code: Genau die gleichen Operationen, die du auf str ausgeführt hast, aber direkt auf file. Danach gegebenenfalls noch alles bis zum nächsten Zeilenumbruch überspringen, falls nötig.


Log in to reply