Endlosschleife bei Lesen eines Bildes
-
Hallo Leute.
Habe folgenden Code:vector<unsigned char> daten; char daten1[255]; int s; ifstream dat; dat.open(path.c_str(), ios::in); while(!dat.eof()) { dat.get(daten1, 255); daten.push_back(*daten1); } dat.close();
Ich bekomme in der while-Schleife ab nur Endlosdurchläufe. Warum?
In path steht der Pfad zu einer Bilddatei.MfG
Muecke
-
hmm... es wird zwar nicht daran liegen, aber trotzdem ein paar Kommentare zu deinem Stil:
ifstream dat; dat.open(path.c_str(), ios::in);
a) oeffne die Datei gleich im Konstruktor von ifstream, das ist performanter.
b) du brauchst kein ios::in mitgeben, das versteht sich bei einem ifstream von selbst (das "i" steht ja extra fuer "input" fstream)d.h. schreib einfach
ifstream dat(path.c_str());
Und diese Zeile ist ziemlich kontraproduktiv:
daten.push_back(*daten1);
Die schreibt naemlich nur das allererste char der 255 gelesenen in den vector.
Ansonsten:
Ich seh in dem Code eigentlich keinen Grund fuer eine Endlosschleife.Test mal, ob die Datei womoeglich gar nicht geoffnet werden konnte:
ifstream dat(path.c_str()); if (!dat) { cout << "failed to open file: " << path << '\n'; return -1; }
[/cpp]
-
Zeige mal den INhalt von "path"
-
Ach ja, nochwas:
da du ein Bild ausliest, musst du die Datei unbedingt Binaer oeffnen:
ifstream dat(path.c_str(), ios::binary | ios::in);
beachte, dass du jetzt auch das ios::in brauchst!
Und lesen solltest du binaere Daten mit read(), nicht mit get():// statt: dat.get(daten1, 255); // einfach dat.read(daten1, 255);
-
In path steht folgendes:
images/Image12.gif
MfG
Muecke
-
oh sorry. Da steht drin:
images\Image123.gif
MfG
Muecke
-
Schonmal mit nem absoluten Pfad versucht?
-
Blue-Tiger schrieb:
Und diese Zeile ist ziemlich kontraproduktiv:
daten.push_back(*daten1);
Die schreibt naemlich nur das allererste char der 255 gelesenen in den vector.
Wie muss der Befehl denn lauten, wenn ich alle chars in meinen Vektor schreiben möchte?
MfG
Muecke
-
Ja mit absolutem Pfad klappt es danke schön.
Aber die Frage zu meinem Beitrag über diesem ist noch nicht klar
-
Du solltest am besten folgendes machen: heraus finden wie groß die Datei ist, und dann den Vector auf die Größe der Datei vergößern. Dann kannst du mit Read in einem Rutsch die Datei in den Vector lesen.
Pseudocode (kanns nicht testen, bin auf Arbeit):
datei.seekg(ios::end); // an das Ende der Datei positionieren int s = datei.tellg(); // Endposition ist auch die Größe daten.resize(s); // Vector resizen, alternativ erst hier den Vector instanzieren und gleich im Konstruktor übergeben datei.seekg(ios::beg); // An den Anfang der Datei zurück datei.read(&daten.at(0), s); // Alle Bytes der Datei lesen