TXT Datei auslesen und sortieren



  • Ich habe eine txt datei nach folgenden muster aufgebaut:"

    4
    das ist eine zeile
    1
    hallo welt
    3
    schon wieder
    2
    das ist der letzte

    "

    ich möchte jetzt diese datei einlesen und sortiert wieder ausgeben in Form von

    1 hallo welt
    2 das ist der letzte
    3 schon wieder
    4 das ist eine zeile

    also immer erst der schlüssel gefolgt von dem string.

    ich bekomme das nicht hin. 😕



  • du könntest dir die datei zeilenweise einlesen. dazu kannst du die funktion getline() nutzen. wenn du die einzelnen zeilen in einen string einliest, kannst du den integer-wert mit der funktion atoi() ermitteln. dann hast du also die zeilennr. und den text und musst es dann nur noch sortieren. ist zwar nicht die eleganteste lösung, aber was besseres fällt ir gerade auch nicht ein.

    also viel spass



  • Wobei das sortieren gerade recht einfach geht, indem du jeweils zwei Textzeilen einliest und dann in einer map speicherst:

    map<int,string> data;
    while(fin)
    {
      string num,line;
      getline(fin,num);
      getline(fin,line);
      data.insert(make_pair(to_int(num),line));
    }
    for(map<int,string>::iterator pos=data.begin();pos!=data.end();++pos)
      fout<<pos->first<<"\t"<<pos->second<<endl;
    

    (fin und fout sind die fstreams, mit denen du arbeitest (für Bildschirm-Ausgabe nimmst du cout), wegen "int to_int(const string&);" kannst du mal in der FAQ nachsehen)



  • oder vielleicht liest man den int doch besser so ein:

    #include <fstream>
    #include <map>
    #include <climits>//für INT_MAX
    using namespace std;
    
    int main(){
        map<int,string> data;
        ifstream fin("test.txt");
        while(fin){
            string line;
            int num;
            fin>>num;//den stream das umwandeln nach integer übernehmen lassen
            fin.ignore(INT_MAX, '\n');//rest der zeile ignorieren
            getline(fin,line);
            data.insert(make_pair(num,line));
        }
    
        ofstream fout("sorted.txt");
        for(map<int,string>::iterator pos=data.begin();pos!=data.end();++pos)
            fout<<pos->first<<"\t"<<pos->second<<endl;
    }
    


  • ich müsste die textdatei auch vorher einmal unsortiert ausgeben. wie mache ich denn das. mit dieser methode ist die datei ja schon sortiert.



  • Textdatei auslesen und ausgeben

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	ifstream fin;
    	fin.open("file.txt", ios::in);
    
    	string line;
    
    	while (!fin.eof())
    	{
    		getline(fin, line);
    		cout << line << endl;
    	}
    
    	fin.close();
    
    	system("PAUSE");
    	return 0;
    }
    


  • danke, das hilft mir weiter. mein problem ist aber, die datei soll einmal eingelesen werden zum beispiel in string line. ich möchte die datei dann aber nicht noch mal einlesen und sortieren, sondern das bereits eingelesene im string line ausgeben und dann das bereits eingelesene sortiert ausgeben. also alles soll in string line geschehen.



  • shurik'N schrieb:

    danke, das hilft mir weiter. mein problem ist aber, die datei soll einmal eingelesen werden zum beispiel in string line. ich möchte die datei dann aber nicht noch mal einlesen und sortieren, sondern das bereits eingelesene im string line ausgeben und dann das bereits eingelesene sortiert ausgeben. also alles soll in string line geschehen.

    In string line steht immer nur eine Zeile der Datei.
    Machs doch wie schon vorher erwähnt, dass du jede Zeile einliest, sie ausgibst und sie gleichzeitig noch in eine Map schreibst, mit der entsprechenden Nummer. Dann lässt du die Map in einer Schleife richtig ausgeben.



  • Dieser Code gibt den letzten unsortieren Satz doppelt aus, sonst läuft alles. Siehe Kommentar

    #include <iostream>
    #include <fstream>
    #include <map>
    #include <climits>//für INT_MAX
    #include <string>
    
    using namespace std;
    
    int main()
    {
        map <int,string> data;
        ifstream eof("uebung7.txt");  
        string line;  
        cout << "Unsortiere Ausgabe: " << endl; 
        cout << endl;
        while(eof)
        {
    
            int num;
            eof>>num;//den stream das umwandeln nach integer übernehmen lassen
            eof.ignore(INT_MAX, '\n');//rest der zeile ignorieren
            getline(eof,line);
            data.insert(make_pair(num,line));
            cout << num << " " << line << endl; //Letzer unsortierte Satz doppelt       
                                                ausgegeben. Warum?
    
        }
        eof.close();
        cout << "Sortierte Ausgabe: " << endl;  
        cout << endl;
        for(map<int,string>::iterator pos=data.begin();pos!=data.end();++pos)
            cout<<pos->first<< " " << pos->second<<endl;
        system("pause");
        return 0;
    }
    


  • Das eof steht für end of file, schätze ich mal.

    Also nenne den Instream mal f_in oder so. Und dann teste es mal, wie in meinem Beispiel:

    while (!f_in.eof())
    


  • SUPER 😃

    aber warum geht das denn nicht mit eof? da müsste er doch auch am ende der textdatei rausspringen?



  • while(fin){
    string line;
    int num;
    fin>>num;//den stream das umwandeln nach integer übernehmen lassen
    fin.ignore(INT_MAX, '\n');//rest der zeile ignorieren
    getline(fin,line);
    data.insert(make_pair(num,line));
    }

    for(map<int,string>::iterator pos=data.begin();pos!=data.end();++pos)
    fout<<pos->first<<"\t"<<pos->second<<endl;

    [/cpp][/quote]

    hallo otze, könntest du mir dieses code segment noch etwas genauer erklären?

    was bewirkt die zeile "fin.ignore(INT_MAX, '\n'); heisst, dass in dieser zeile nur der integer wert ausgelesen wird.

    und wo läuft das eigentlichen sortieren im code?
    der iterator steht ja auf dem beginn der datei und dann?



  • Bin zwar nicht otze, aber trotzdem:

    shurik'N schrieb:

    was bewirkt die zeile "fin.ignore(INT_MAX, '\n'); heisst, dass in dieser zeile nur der integer wert ausgelesen wird.

    Nach Eingabe des integers ignorierst du den Rest der Zeile (sollte eigentlich nur noch ein '\n' sein) - ohne diesen Befehl würde der getline() in der selben Zeile weiterlesen.

    und wo läuft das eigentlichen sortieren im code?

    Beim Einordnen der Datensätze in die Map "data" (eine Map speichert ihre Elemente sortiert.

    PS: "eof" ist ein saublöder Bezeichner für eine Datei 😉


Anmelden zum Antworten