 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Henrik Gebauer Guest
|
Posted: Sun Sep 12, 2004 9:12 am Post subject: fstream::seekg() hat keine Auswirkung |
|
|
Hallo,
Ich möchte eine Datei zunächst bis zum Ende auslesen und dann noch einmal
zum Anfang zurück gehen, weil beim ersten Auslesen einige Informationen
übersprungen werden müssen.
Nach dem Anwenden von seekg() verändert sich die Leseposition jedoch nicht.
Codeschnipsel:
ifstream datei;
char c;
datei.open("datei.txt");
while (!datei.eof()) datei.get(c);
datei.seekg(0);
cout << datei.tellg() << endl; // immer noch Dateiende
Was mache ich falsch? (Compiler ist g++ 3.4.1)
MfG
Henrik
--
http://www.henrikgebauer.de.vu
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Sun Sep 12, 2004 11:36 am Post subject: Re: fstream::seekg() hat keine Auswirkung |
|
|
Henrik Gebauer <henrik.gebauer (AT) web (DOT) de> writes:
| Quote: | Ich möchte eine Datei zunächst bis zum Ende auslesen und dann noch einmal
zum Anfang zurück gehen, weil beim ersten Auslesen einige Informationen
übersprungen werden müssen.
Nach dem Anwenden von seekg() verändert sich die Leseposition jedoch nicht.
Codeschnipsel:
ifstream datei;
char c;
datei.open("datei.txt");
|
Diese Operation kann schiefgehen; Du solltest das zuerst prüfen.
| Quote: | while (!datei.eof()) datei.get(c);
|
Das ist ein Rezept für eine Endlosschleife. Wenn get() aus einem anderen
Grund als eof() scheitert, wird die Schleife nicht verlassen.
So sollte das Programm zuverlässiger laufen:
std::ifstream datei("datei.txt");
char c;
while (datei.get(c))
; // c verarbeiten
Auch diese Operation kann scheitern.
Zudem bin ich mir nicht sicher, ob eine implizite Umwandlung von 0 auf
den pos_type eines Streamtyps existieren muss (wahrscheinlich aber schon).
Sicher aber ist das Flag immer noch gesetzt, welches weiter oben zur
Beendigung der Schleife geführt hat.
Statt den Stream mit seekg() zurückzuspulen, würde ich ein neues Stream-Objekt
erzeugen. Das hat dann sicher einen "frischen" Zustand.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Johannes Hampel Guest
|
Posted: Sun Sep 12, 2004 2:21 pm Post subject: Re: fstream::seekg() hat keine Auswirkung |
|
|
Henrik Gebauer wrote:
| Quote: | Hallo,
Ich möchte eine Datei zunächst bis zum Ende auslesen und dann noch einmal
zum Anfang zurück gehen, weil beim ersten Auslesen einige Informationen
übersprungen werden müssen.
Nach dem Anwenden von seekg() verändert sich die Leseposition jedoch nicht.
Codeschnipsel:
ifstream datei;
char c;
datei.open("datei.txt");
while (!datei.eof()) datei.get(c);
datei.seekg(0);
cout << datei.tellg() << endl; // immer noch Dateiende
Was mache ich falsch? (Compiler ist g++ 3.4.1)
MfG
Henrik
|
Da das letzt datei.get() schief gehen muss, ist das fail bit im Stream
gesetzt und jede weitere Operation bleibt ohne wirkung. Nach dem while
würde ich mal ein datei.clear() probieren.
Johannes
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Henrik Gebauer Guest
|
Posted: Mon Sep 13, 2004 10:55 pm Post subject: Re: fstream::seekg() hat keine Auswirkung |
|
|
Johannes Hampel wrote:
| Quote: | Da das letzt datei.get() schief gehen muss, ist das fail bit im Stream
gesetzt und jede weitere Operation bleibt ohne wirkung. Nach dem while
würde ich mal ein datei.clear() probieren.
|
Danke, das war es.
MfG
Henrik
--
http://www.henrikgebauer.de.vu
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Wed Sep 15, 2004 9:12 am Post subject: Re: fstream::seekg() hat keine Auswirkung |
|
|
Thomas Maeder <wvzksipclfjf (AT) mailinator (DOT) com> wrote
| Quote: | Henrik Gebauer <henrik.gebauer (AT) web (DOT) de> writes:
Ich möchte eine Datei zunächst bis zum Ende auslesen und dann noch
einmal zum Anfang zurück gehen, weil beim ersten Auslesen einige
Informationen übersprungen werden müssen. Nach dem Anwenden von
seekg() verändert sich die Leseposition jedoch nicht.
Codeschnipsel:
ifstream datei;
char c;
datei.open("datei.txt");
Diese Operation kann schiefgehen; Du solltest das zuerst prüfen.
while (!datei.eof()) datei.get(c);
Das ist ein Rezept für eine Endlosschleife. Wenn get() aus einem
anderen Grund als eof() scheitert, wird die Schleife nicht verlassen.
|
Stimmt. Auch: nach dem Lesen des letzten Zeichens ist
wahrscheinlicherweise eof() noch falsch (weil get() keinen Look-Ahead
braucht). Also geht das letzte Lesen schief. Wenn er keinen anderen Test
aber hat, dann benutzt er das Zeichen, obwohl es gar nicht gelesen
wurde.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|