Problem nach dem Rücksetzten des Lesezeigers
-
Hallo erstmal,
ich habe ein Problem mit einem Program ,das bestimmte Dateien einlesen soll.
Ich mache erst einen Testdurchlauf ,um zu prüfen ,ob die Datei passt und wollte dann den Lesezeiger zurücksetzten ,um dann nochmal lesen zu können,aber es werden keine weiteren Daten mehr eingelesen.Weiß jemand warum?
Vielen Dank schonmal.
-
Hallo
Weil dein Quellcode fehlerhaft ist.
Ich hoffe du hast den dezenten Hinweis verstanden.bis bald
akari
-
Entweder soll das heißen das es theoretisch möglich ist und ich zu blöd bin oder,dass ich den code posten soll.Bin mir nicht ganz sicher.
-
Code posten nehm ich mal an - also... ^^
Und ja, theoretisch sollte es möglich sein...
-
int CSpielfeld::LadeSpielfeld(const char* Dateiname) { char cTest;//Prüfvariable zum testen auf Zeichen ifstream Datei; Datei.open(Dateiname,ios_base::in); //Prüfvorgänge //Öffnen allgemein: if(!Datei) { cout << "\"" << Dateiname << "\"konnte nicht geoeffnet werden."; system("PAUSE"); return 1; } //Prüfen auf Dateiformat for(int y=0;y<MAX_LAENGE;y++)//Zählschleifen um den Zeilenumbruch mit einzubeziehen { for(int x=0;x<MAX_BREITE;x++) { Datei.get(cTest); if (cTest != '+' && cTest != '-')//Prüfung auf falsche Zeichen { cout <<"Falsches Dateiformat(Zeichen beachten)"; system("PAUSE"); Datei.close(); return 1; }//End if }//end For(x) Datei.get(cTest); if(cTest != '\n' && y !=MAX_LAENGE-1)//Zeilenumbruch muss nach jeder Zeile folgen ausser nach der letzten. { cout <<"Falsches Dateiformat(Umbruch beachten)"; system("PAUSE"); Datei.close(); return 1; } //End if }//End for(y) Datei.seekg(ios::beg); for(int y=0;y<MAX_LAENGE;y++) { for(int x=0;x<MAX_BREITE;x++) { cout<<Datei.get(m_cSpielfeld[x][y]);//Inhalt auf das Spielfeld übertragen }//End For(x) Datei.ignore();//Zeilenumbruch wird ignoriert }//End For(y) Datei.close(); cout << "Datei closed"; system("PAUSE"); return 0; }//End FunktionDie Dateien müssen so aussehen:
+++++
-----
+++++
-----
+++++
also nur die beiden Zeichen und in der obigen konstellation
-
Um eine Datei mehrmals lesen zu können, mußt du die Statusflags zurücksetzen (z.B. falls schon EOF gesetzt ist):
Datei.clear(); Datei.seekg(ios::beg);P.S. system(...) is evil!
und Fehlerausgaben solltest du auf 'cerr' leiten (statt cout).
-
oh danke das wusste ich net.
warum sind system befehle evil?Und das cout is erstaml nur führ mich damits schneller geht.kommt später noch ne logfile klasse dazu.
-
Dann nimm std::clog. Das kannst du später immernoch umleiten (std::clog::rdbuf umstellen!)
Datei.close kannst du dir sparen, macht der Destruktor von Datei!
Variablen am Dateianfang deklarieren, wird von vielen alten Lehrbüchern gelehrt, doch ist es eigtl. schwachsin. Kann sein das der Compiler es optimieren kann, aber wenn ein Objekt nicht gebraucht wird, sollst du es auch nicht anlegen, weil es nur unnötig den Speicher belastet.Deine Klasse ist nicht unbedingt wiederverwendbar, wenn du die Fehlermeldungen direkt in der Funktion ausgibst. Arbeite Lieber mit Exceptions (definier dir bsw. eine Klasse von std::exception abgeleitet) oder Fehlercodes(return 1 => alles ok, return 2 => datei nicht öffnebar usw.).
Warum ließt du eigtl. 2 mal ein? Kannst doch hingehen und, wenn du die Werte kontrolliert hast, direkt diese in den Daten-Array reinzupacken.
Ich weiß nicht ob was für ein Spielfeld es sich handelt, aber ansonsten kannst du auch hingehen und bsw. in den ersten 2 Werten die Breite und Größe auslesen und dann dynamisch einen entsprechend großen Array erstellen.
-
mehrdimensionale Arrays sind mir dynamisch zu umständlich...
-
std::vector< std::vector<int> > data;schon hast du einen 2 dimensionalen array von int mit Bezeichner data.