Datei Zeilen sortieren und nur bis Zeilenumbruch einlesen



  • Hallo,

    ich habe eine TXT-Date wie folgt:
    aaammm; ddnn; bbccff; .........;
    123; 123; 4334; 0,89; .........;

    hier mein code

    [code="cpp"][code]
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <cstring>

    using namespace std;

    int main () {
    string line;
    ifstream testfile ("test.txt");
    ofstream myfile ("myfile.txt");

    if (testfile.is_open())
    {
    while ( testfile.good() )
    {
    getline (testfile,line,';');
    myfile << line << endl;
    }
    }
    testfile.close();
    }

    else cout << "Unable to open file";

    return 0;
    }

    Aber ich möchte nur die erste Zeile einlesen (nur die Strings) und diese mir alphabetisch sortiert in einer TXT-abspeichern.
    Hier brauche ich HILFE 😉

    MfG,
    Averroes



  • Hallo Averroes,

    das geht z.B. mit einem kleinen Helferlein is_endl , welches hier im Forum schon mehrfach zum Einsatz kam:

    #include "is_endl.h" // siehe http://www.c-plusplus.net/forum/p1940874#1940874
    #include <algorithm> // sort
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    
    int main()
    {    
        using namespace std;
        vector< string > strings;
        {   // ---  Einlesen
            ifstream testfile("test.txt");
            if( !testfile.is_open() )
            {
                cerr << "Fehler beim Oeffnen der Datei" << endl;
                return -2;
            }
            for( string s; !is_endl( testfile ) && getline( testfile, s, ';' ); ) // Lese bis Zeilenende hinter dem ';'
                strings.push_back( s );
        }
        sort( strings.begin(), strings.end() ); // alphabetisch sortieren
        {   // ---  Abspeichern
            ofstream myfile("myfile.txt");
            for( vector< string >::iterator i = strings.begin(); i != strings.end(); ++i )
                myfile << *i << endl;
        }
        return 0;
    }
    

    Gruß
    Werner

    @Edit: #include <iterator> hinzugefügt (s. Beitrag von Eisflamme)
    @Edit2: auf C++03 abgeändert (s. Beitrag von SeppJ)



  • Hi Werner,

    ich bekomme folgende Fehlermeldung:
    Zeile 22: sort .... "begin was not declared in this scope"
    Zeile 26: Invalid type argument of 'unary*'

    Danke und Gruß,
    Averroes



  • Hallo,
    versuch es doch mit getline(), um eine Zeile einzulesen und die lib "algorithm" um es dann alphabetisch zu ordnen.



  • HI,

    wie meinst du das?
    Ich bin noch ein Anfänger 😕
    Etwas präzisier 😉

    Gruß,
    Averroes



  • Also mit getline würde ich die eine Zeile einlesen und in einem String speichern.
    Dann könntest du auf Leerzeilen o.ä. prüfen und die einzelnen Wörter in einem Container speichern. Danach kannst du mit der Funktion sort() von "algorithm" deinen Container sortieren und hokus pokus hast du die erste Zeile eingelesen, in einzelne Strings zerteilt und sortiert. 😃



  • Das ist in <iterator> definiert, wobei ich nicht weiß, ob das nicht sowieso implizit eingebunden wird.

    Nimm statt begin(strings) einfach strings.begin(), wenn es auch mit include nicht klappt.

    Taulinator:
    Da fehlt noch, wie man die gelesene Zeile dann wirklich splittet. Aber auch dann ist es ein unnötiger Umweg, der (ohne boost::split) imo auch zu schlechter lesbarem Code führt.


  • Mod

    Eisflamme schrieb:

    Das ist in <iterator> definiert, wobei ich nicht weiß, ob das nicht sowieso implizit eingebunden wird.

    Ich tippe eher auf nicht aktivierte C++11-Unterstützung. Wie man C++11 anschaltet kommt auf deinen Compiler an. Steht sicherlich im Handbuch, aber schneller zu finden vermutlich bei Google.

    Oder eben den Code umschreiben, so dass er ohne C++11 auskommt, so wie von Eisflamme beschrieben.



  • Eisflamme:
    Soweit ich weiss kann man bei getline() auch einen dritten Parameter eingeben(delimiter) und somit splittet man dann den String.

    EDIT:
    getline() benötigt als ersten Parameter einen istream 🙂
    Sorry



  • SeppJ schrieb:

    Ich tippe eher auf nicht aktivierte C++11-Unterstützung.

    stimmt - siehe zweiter Fehler in Zeile 26



  • Hi,

    Werner und wie aktiviere ich C11 in Xcode unter Mac????

    @ Eisflamme, wenn ich aber string.begin() schreiben bekomme ich keine Fehlermeldung, aber das mit Zeile 25 "i" bekomme ich imnmer noch.

    Gruß,
    Averroes



  • Averroes schrieb:

    Werner und wie aktiviere ich C11 in Xcode unter Mac????

    @ Eisflamme, wenn ich aber string.begin() schreiben bekomme ich keine Fehlermeldung, aber das mit Zeile 25 "i" bekomme ich imnmer noch.

    .. ich habe den Code so verändert, dass er jetzt bei Dir laufen sollte. Siehe oben! (Seite ggf. noch mal aktualisieren)

    Gruß
    Werner



  • Hi Werner,

    dein Code einfach SUPER --> 👍

    Danke allen Anderen auch.

    Schönen Abend,
    Averroes


  • Mod

    Averroes schrieb:

    Werner und wie aktiviere ich C11 in Xcode unter Mac????

    C11 gibt's übrigens auch als Programmiersprache (ein Standard von C), ist aber ganz was anderes als C**++**11. Das ist wichtig, wenn man nach den Begriffen googelt.


Anmelden zum Antworten