[gelöst] Dateiauslesung scheitert mit unbekanntem Fehler
-
Hi,
ich habe folgenden Quelltext der am Ende eine Datenbank auslesen soll. Der erste Eintrag in der Datenbank beginnt mit dem Wort World. Davor kommen in etwa 80.000
Byte mit Dingen, die ich nicht benötige. Die Datei kann mein Programm öffnen und auch das Auslesen der ersten Zeichen in das Array World[6] funktioniert fehlerfrei. Doch sobald das Programm versucht, Daten in One zu speichern, gibt es die selbst erzeugte Fehlermeldung:Fehler beim Lesen der Datei an Position:-1
aus. Auch wenn ich One z.B. in One[6] umwandle, ändert dies nichts daran. Ich hatte schon einmal einen solchen Fehler, aber da hatte ich meinen gültigen Speicherbereich verlassen. Doch hier sehe ich irgendwie nicht, wo der Fehler liegt:
#include <iostream> #include <fstream> #include <string> #include <sstream> using namespace std; //Funktionen global definieren void SearchBeginning(ifstream* OrigData); int main() { //Arbeitsvariablen string Buffer; ifstream OrigData("Master.mwBase"); int Step = 0; //Fehlerausgabe if(!OrigData) cout << "Master.mwBase nicht gefunden.\n"; //Speichervariablen string Name; string Edition; string Color; string Cost; string Type; string Text; string Power; string Toughness; string Rarity; string Artist; string Flavor; //Beginn suchen und zu Beginn springen SearchBeginning(&OrigData); //5 Zeichen auslesen char World[6]; OrigData.read((char *)&World, sizeof(World)); cout << World[0] << World[1] << World[2] << World[3] << World[4] << endl; system("PAUSE"); return 0; } void SearchBeginning(ifstream* OrigData) { char One; char World[6]; //5 Zeichen auslesen (*OrigData).read((char *)&World, sizeof(World)); if (!(*OrigData).good()) { cerr <<"(World) Fehler beim Lesen der Datei an Position:" << (*OrigData).tellg() << endl; system("PAUSE"); } //Ausleseschleife while(World[0] != 'W' || World[1] != 'o' || World[2] != 'r' || World[3] != 'l' || World[4] != 'd') { //cout << World[0] << World[1] << World[2] << World[3] << World[4] << endl; //1 weiteres Zeichen auslesen (*OrigData).read((char *)&One, sizeof(One)); if (!(*OrigData).good()) { cerr <<"Fehler beim Lesen der Datei an Position:" << (*OrigData).tellg() << endl; system("PAUSE"); } //World ein Zeichen weiter durchrücken lassen World[0] = World[1]; World[1] = World[2]; World[2] = World[3]; World[3] = World[4]; World[4] = One; } //5 Zeichen vorrücken, damit Korrekt anfängt einzulesen (*OrigData).seekg (-5, ios::cur); //(*OrigData).seekg (81804, ios::beg); }
-
Klingt so, als würde er die gesuchte Zeichenkette nicht finden und du stößt irgendwann einfach ans Ende der Datei.
-
Nein nein, das hatte ich erst auch vermutet. Deshalb habe ich überall die:
system("PAUSE")eingefügt.
Schon beim ersten Versuch tritt dieser Fehler auf. Und weil es sich scheinbar nicht in der Datei befindet, läuft das Programm dann natürlich in Endlosschleife, weil es nur Unsinn ausliest. (Zeile 65 nicht auskommentiert hat wilden Sonderzeichenunfug und wütendes Piepen des Rechners zu Folge. Nach einem kleinen Moment gibt es dann nur noch Whitespace-Zeichen aus, ka wo auf der Festplatte es dann gelandet ist.)
-
Du liest nicht zufällig Binärdaten ein? Schau dir mal ios::binary an.
Edit: Ach ja, und ein Debugger wär für dich was Tolles.
-
Ja ich habe ja ios:binary gesetzt. Ich benutze Code::Blocks und der Debugger von meinem Code::Blocks spinnt. Bringt aber auch in diesem Fall überhaupt gar nichts, ich ahbe meine Variablen ja schon alle ausgeben lassen und das Resultat davon im letzten Post beschrieben. In dem Moment, wo in den charakter One ausgelesen wird, rückt der Lesezeiger an eine ungültige Position und es wird Unfug von irgendwoher ausgelesen. Der Fehler, warum der Lesezeiger aber an eine ungültige Stelle rückt, müsste im Quelltext sein. Die Datenabnk die ich auslese ist 4,65 MB groß, also dauert es eine Weile, bis man dort am Ende angelangt.
-
Klingt so, als würde er die gesuchte Zeichenkette nicht finden und du stößt irgendwann einfach ans Ende der Datei.
Little Programmer schrieb:
Nein nein, das hatte ich erst auch vermutet. Deshalb habe ich überall die:
system("PAUSE")eingefügt.
Und inwieweit helfen dir die zu erkennen, dass er nicht am Ende der Datei angekommen ist

Wie sieht's denn mit Gross/Kleinschreibung von 'world' aus?
Sehr effektiv ist das Ganze übrigens auch nicht, pro gelesenem Zeichen 5 Zeichen zu kopieren.
-
[Edit]Ganzer Post gelöscht. Oh man. Tretet mich. Ich hatte "ios::binary" gesetzt. Ka wieso und wann. Ich hatte gar nicht mitbekommen, dass ichs gelöscht hatte. Mit funktionierts natürlich einwandfrei. Jetzt frag ich mich nur, wann ich das gelöscht habe und wieso. Sorry für die Scherereien.[/Edit]