Textdatei einlesen



  • Hallo zusammen,

    ich bin absoluter Anfänger was C++ angeht und ich muss eine Aufgabe lösen, bei der ich zwar eine gewisse Ahnung habe, wie man das machen soll, aber nicht, wie ich das in Programmiersprache umsetze.

    Die Aufgabe: Ich soll ein Programm schreiben, welches die Datei student.txt zeilenweise einliest und sortiert nach folgendem Schema: Nachname, Vorname, Matrikelnummer, Notendurchschnitt und Geburtsjahr.

    ...und das Ganze natürlich noch in eine neue Datei schreibt.

    Was ich da bis jetzt zusammengetippt habe ist:

    #include <fstream>
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
        int p;
        int matrikelnummer;
        int geburtsjahr;
        float note;
        string Vorname;
        string Name;
        string w; 
        string x;
    
        ifstream file;
        string s;
        file.open("student.txt");
        while (!file.eof())
        {
            getline(file, s);
    
            p=s.find("\t");
    
            w=s.substr(p,3).c_str();
    
        cout<<p<<endl;
    
        }
        file.close();
    }
    

    So, Datei zeilenweise mit der While-Schleife und getline (Zeile 21-23) einlesen klappt schon mal.

    Meine Idee ist jetzt, mit dem Befehl p=s.find("\t"); aus Zeile 25 die Datei nach Tabulatoren abzusuchen (in der Textdatei sind ausschließlich Tabulatoren enthalten, keine Leerzeichen).

    Die Stellen, an denen ein Tabulator gefunden wird, habe ich mit p schon mal definiert.

    Anschließend möchte ich jetzt mit der Verschiebungsfunktion s.substr(p,3).... die Wörter verschieben.

    Wie ich jetzt weiter machen soll, entschließt sich meinem Wissensstand.
    Kann mir da jemand weiterhelfen?

    Danke schon mal im Voraus für die Hilfe.



  • Warum getline?
    while(file>>Vorname >> Name ...)

    Tja, weiter? Struct mit Daten in std::vector?


  • Mod

    manni66 schrieb:

    Warum getline?
    while(file>>Vorname >> Name ...)

    Ich vermute mal, dass auch Leerzeichen in den Namen vorkommen können. Eine mögliche Lösung wäre, die locale entsprechend zu ändern, damit Leerzeichen nicht mehr als whitespace gelten, aber ich denke, wesentlich anfängerfreundlicher wäre es, den Trennzeichenparameter von getline zu nutzen. getline ist ja offensichtlich schon bekannt:

    while(getline(file, Vorname, '\t') && getline(file, Nachname, '\t') && getline(file, w, '\t') && getline(file, x, '\n'))
    

    (man beachte, dass das letzte getline nach einem Zeilenumbruch sucht)

    Der Threadersteller wird hoffentlich auch bemerken, dass keiner von uns beiden den while(!eof) -Quatsch gemacht hat. Das while(!eof) -Schema ist logisch falsch. Erstens prüft es nur auf eof, nicht auf alle möglichen Fehler (so wie es die Beispiele in den Antworten tun). Zweiten, und das wiegt viel schwerer, prüft es zum falschen Zeitpunkt: Vor dem Leseversuch! Aber erst ein gescheiterter Leseversuch setzt ein Fehlerflag. Das heißt, im Falle eines Fehler werden fröhlich falsche Daten verarbeitet, erst beim erneuten Prüfen der Schleifenbedingung wird der Fehler entdeckt, dann aber ist es zu spät. Man vergleiche:
    http://ideone.com/ZSNsMA -> Eingabe "1 2 3 4 ", Ausgabe "12344"
    http://ideone.com/XnUJFq -> Eingabe "1 2 3 4 ", Ausgabe "1234"
    Wer dir das beigebracht hat, hat keine Ahnung von C++ oder anderen, C-artigen Sprachen, und sollte nicht weiter als Quelle zum Lernen benutzt werden. Leider wird dieser Fehler immer noch oft durch schlechte Lehrer und Bücher verbreitet. Falsches zu lernen ist schlimmer, als gar nichts zu lernen 🙂 .



  • SeppJ schrieb:

    manni66 schrieb:

    Warum getline?
    while(file>>Vorname >> Name ...)

    Ich vermute mal, dass auch Leerzeichen in den Namen vorkommen können.

    Ja, da aber

    Roman_ schrieb:

    (in der Textdatei sind ausschließlich Tabulatoren enthalten, keine Leerzeichen).

    ist die Aufgabe möglicherweise bewusst einfach gehalten.



  • Sorry für OT:

    Wenn ich mir die verlinkte Datei anschaue und Namen wie Josef Stalin oder Charles Manson lese, kann ich gar nicht so viel fressen, wie ich kotzen möchte...
    Das ist nicht witzig und auch nicht cool.

    Wie arm, respekt- und geschichtslos muss man sein, um die Namen dieser Menschen in der üblichen "Programmieren Sie eine Studentenverwaltung"-Übung zu benutzen?



  • @manni
    @SeppJ

    Danke an euch Beiden. Habt mir sehr geholfen, ich hab das mit dem von SeppJ zur Verfügung gestellten Code gemacht und das Ganze dann in eine neue Datei schreiben lassen, allerdings nicht durch Vektoren, sondern ganz normal per Schreibbefehl

    file<<xx<<"\t"<<xx<<endl;
    

    Und das hat auch geklappt.



  • Und wie wird sortiert?


Anmelden zum Antworten