[C/C++] Problem mit verketteten Listen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von eevaa, 11. Februar 2009 .

Schlagworte:
  1. 11. Februar 2009
    Problem mit verketteten Listen

    Hallo Leute.
    Hier die Aufgabenstellung:
    a)
    Schreiben Sie ein Programm, dass zunächst abfragt, ob eine Datei beschrieben oder aus
    einer Datei gelesen werden soll. Anschließend soll der Dateiname eingegeben werden.
    Falls die Datei beschrieben werden soll: Ihre Matrikelnummer als Zahl (nur die letzten 9
    Stellen) und Ihr Namen sollen eingeben und in einer Textdatei gespeichert werden.
    Beachten Sie, dass ein Name aus mehreren Wörtern besteht, z. B Vor- und Nachname.
    Falls aus der Datei gelesen werden soll: Ihre Matrikelnummer und Ihr Name sollen aus der
    Datei gelesen und auf dem Bildschirm angezeigt werden.
    b)
    Erweitern Sie das Programm, damit auch mehrere Studenten eingegeben und in der
    Textdatei gespeichert werden bzw. mehrere Studenten aus der Textdatei gelesen werden
    können.
    c)
    Erweitern Sie die Datenstruktur, so dass folgende Inhalte gespeichert werden: Name,
    Matrikel-Nummer als Zahl (nur die letzten 9 Stellen), Note Elektrotechnik und Note
    Informatik. Beachten Sie, dass ein Name aus mehreren Wörtern besteht, z. B Vor- und
    Nachname. Beachten Sie, dass diese Datenstruktur kombatibel zur Aufgabe 30) ist.

    Mein Code sieht bisher so aus:
    Code:
    #include <iostream>
    #include <fstream>
    #include <math.h>
    using namespace std;
    
    struct student 
    {
     string Name;
     int MatrNr;
     float NoteET;
     float NoteInfo;
    };
    
    int main(void) 
    {
     char c;
     fstream f; 
     string dummy;
     char b = 'g' ;
     char filename[250]; 
     student studenten; 
     cout << "Wollen sie schreiben oder ausgeben [s/a]";
     cin >> c; 
     cout << "Geben Sie den Dateinamen ein: ";
     cin >> filename;
     
     if(c == 'a') 
     {
     f.open(filename, ios::in);
     
     if(!f) 
     {
     cerr << "Datei kann nicht geoeffnet werden " << endl; 
     }
     
     else 
     { 
     while ( !f.eof() ) 
     { 
     getline(f,studenten.Name); 
     f>>studenten.MatrNr;
     getline(f,dummy);
     f>>studenten.NoteET;
     getline(f,dummy);
     f>>studenten.NoteInfo;
     getline(f,dummy); 
     
     cout << "Name: " << studenten.Name << endl;
     cout << "Matriknr.: " << studenten.MatrNr << endl; 
     cout << "Note ET: " << studenten.NoteET << endl; 
     cout << "Note Informatik: " << studenten.NoteInfo << endl; 
     }
     f.close();
     } 
     } 
     
     if(c == 's')
     {
     f.open(filename, ios::out);
     
     while(b != 'n') 
     { string dummy;
     cout << "Name: ";
     cin.ignore();
     getline(cin,studenten.Name);
     cout << "Matrikel-Nr. eingeben: ";
     cin >> studenten.MatrNr; 
     getline(cin,dummy); 
     cout << "Note Elektrotechnik eingeben: ";
     cin >> studenten.NoteET; 
     cout << "Note Informatik eingeben: ";
     cin >> studenten.NoteInfo; 
     
     f << studenten.Name << endl << studenten.MatrNr << endl << 
     studenten.NoteET << endl << studenten.NoteInfo <<endl;
     
    // if(f.eof())
     // f << endl;
     
     cout << "Noch ein Datensatz eingeben [j/n] "; 
     cin >> b;
     }
     
     cout << endl;
     cout << "Datei erstellt." << endl;
     f.close(); 
     } 
     
     system("Pause");
     return 0;
    }
    
    Nehme ich den Code so ist die Ausgabe falsch. Nehme ich das auskommentierte und lasse dafür das letzte endl davor weg ist es auch falsch.

    Kann mir jemand weiter helfen?
    Wäre echt super.

    Danke schonmal
     
  2. 11. Februar 2009
    AW: Problem mit verketteten Listen

    du musst dir mal deine ausgabe datei anschaun. Da schummelt sich am ende immer noch ein endl ein. Das führt dann beim auslesen der Datei dazu, dass er ein erneutes mal in die While SChleife geht und noch einen Datensatz ausgeben möchte. Also bekommt man dann als Namen: "die Leere Zeile" und den rest holt er sich kA von wo . naja du kannst es mal selbst probieren wenn du das mal in deiner while SChleife einfügst
    Code:
     while ( !f.eof() ) 
     { 
     
     getline(f,studenten.Name);
     [B] if (f.eof())
     cout <<"END OF FILE" << endl;[/B]
     f>>studenten.MatrNr;
     getline(f,dummy);
     f>>studenten.NoteET;
     getline(f,dummy);
     f>>studenten.NoteInfo;
     getline(f,dummy); 
     
     cout << "Name: " << studenten.Name << endl;
     cout << "Matriknr.: " << studenten.MatrNr << endl; 
     cout << "Note ET: " << studenten.NoteET << endl; 
     cout << "Note Informatik: " << studenten.NoteInfo<<endl; 
     }


    naja somit liegt der fehler nciht beim Ausgeben sondern beim einlesen. Du musst nur verhindern das wenn kein neuer Datensatz hinzugefügt wird auch keine neue Zeile in deiner Ausgabe Datei auftaucht. Lässt sich unelegand so lösen:

    Code:
     
     while(b != 'n') 
     { string dummy;
     cout << "Name: ";
     cin.ignore();
     getline(cin,studenten.Name);
     cout << "Matrikel-Nr. eingeben: ";
     cin >> studenten.MatrNr; 
     getline(cin,dummy); 
     cout << "Note Elektrotechnik eingeben: ";
     cin >> studenten.NoteET; 
     cout << "Note Informatik eingeben: ";
     cin >> studenten.NoteInfo; 
     f << studenten.Name << endl << studenten.MatrNr << endl << 
     studenten.NoteET << endl << studenten.NoteInfo;
     
    // if(f.eof())
     // f << endl;
     
     cout << "Noch ein Datensatz eingeben [j/n] "; 
     cin >> b;
     [B] if (b == 'j')
     f << endl;[/B]
     }
     
     cout << endl;
     cout << "Datei erstellt." << endl;
     f.close(); 
     } 
    sollte klar sein oder?
     
  3. 11. Februar 2009
    AW: Problem mit verketteten Listen

    Ja super nun funktioniert es.
    Genau das hat mir gefehlt

    Danke schön!
     
  4. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.