eof wird nicht erkannt
-
Hallo zusammen.
Im Moment schreibe ich ein kleines Programm welches geometrische Elemente einliest.
ofstream fileout; // Dateiausgabe ifstream filein; // Dateieingabe CFlaeche *pflaeche[anzahl] , *temp; // Hilfsobjekte // Datei oeffnen filein.open("C:\\Dokumente und Einstellungen\\Tosch.TOSCH-HQTX0QQU5\\Desktop\\geometrie.txt"); if(!filein.fail()) // ueberpruefen ob oeffnen erfolgreich { do { filein >> c; switch(c) { case 'R': // Rechteck cout << "lese Rechteck..." << endl; pflaeche[counter] = new CRechteck; pflaeche[counter]->feinlesen(filein); counter++; break; case 'Q': // Quadrat cout << "lese Quadrat..." << endl; pflaeche[counter] = new CQuadrat; pflaeche[counter]->feinlesen(filein); counter++; break; case 'K': // Kreis cout << "lese Kreis..." << endl; pflaeche[counter] = new CKreis; pflaeche[counter]->feinlesen(filein); counter++; break; default: break; } }while(!filein.eof()); // durchlauf bis dateiende } filein.close();Die Textdatei welche ausgelesen werden soll sieht für Quadrate folgendermaßen aus. Q 16 16 2/3 6/3 6/7 2/7
Und die dazugehörige Funktionen lauten.
zum Speichernvoid CQuadrat::save(ofstream o) { ofstream out = o; out << "Q" << " " << flaeche << " " << umfang << " " << koordinaten[0].x << "/" << koordinaten[0].y << " " << koordinaten[1].x << "/" << koordinaten[1].y << " " << koordinaten[2].x << "/" << koordinaten[2].y << " " << koordinaten[3].x << "/" << koordinaten[3].y << endl; } und zum einlesen. void CQuadrat::feinlesen(ifstream i) { ifstream ein = i; ein >> flaeche >> umfang >> koordinaten[0].x >> koordinaten[0].y >> koordinaten[1].x >> koordinaten[1].y >> koordinaten[2].x >> koordinaten[2].y >> koordinaten[3].x >> koordinaten[3].y; }Vielleicht kann mir jmd bei dem folgendem Problem helfen! Nachdem ich ein Objekt eines Quadrates erstelle, und das Programm ausführe werden zwei Objekte des Quadrates eingelesen obwohl nur eines erstellt wurde.
Ich denke das das Ende der Datei beim ersten Durchlauf nicht erkannt und ein ernueter Schleifendurchgang erfolgt.
Hat jmd vielleicht eine Idee wie ich das Problem lösen könnte? Danke schon im vorraus.Gruß Stefan
//Edit: [ b ] => [ cpp ]
-
Was machst du mit dem / das in der Datei steht?
Vielleicht trennst du die Werte einfach mit einem Leerzeichen, dann musst du deine Laderoutine nichtmal ändern.
-
Leider ändert sich auch mit dem entfernen des Trennzeichen nichts. Das Dateiende wird immer noch nicht korrekt erkannt.
-
Du sollst es auch nicht entfernen sondern korrigieren.
Ich erklärs dir mal:
void CQuadrat::feinlesen(ifstream i) { ifstream ein = i; ein >> flaeche //zustand gut, da das leerzeichen ignoriert wird und die erste Zahl ausgelesen wird >> umfang //Leerzeichen wird ignoriert und Zahl ausgelesen >> koordinaten[0].x /* Leerzeichen ignoriert Zahl auslesen */ >> koordinaten[0].y /* Beim Versuch eine Zahl auszulesen stößt der Stream auf das / und versetzt den Stream in einen Fehlerzustand, diese und alle nachfolgenden Aktionen schlagen fehl */ >> koordinaten[1].x >> koordinaten[1].y >> koordinaten[2].x >> koordinaten[2].y >> koordinaten[3].x >> koordinaten[3].y; }
-
Das selbe Problem hatten wir doch gestern schon mal - guckst du hier.
-
Danke für eure Hilfe. Habs hinbekommen.
Grüße Stefan[cpp]