C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

fstream::seekg() hat keine Auswirkung

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Henrik Gebauer
Guest





PostPosted: Sun Sep 12, 2004 9:12 am    Post subject: fstream::seekg() hat keine Auswirkung Reply with 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
--
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





PostPosted: Sun Sep 12, 2004 11:36 am    Post subject: Re: fstream::seekg() hat keine Auswirkung Reply with quote



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


Quote:
datei.seekg(0);

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





PostPosted: Sun Sep 12, 2004 2:21 pm    Post subject: Re: fstream::seekg() hat keine Auswirkung Reply with quote



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





PostPosted: Mon Sep 13, 2004 10:55 pm    Post subject: Re: fstream::seekg() hat keine Auswirkung Reply with quote

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





PostPosted: Wed Sep 15, 2004 9:12 am    Post subject: Re: fstream::seekg() hat keine Auswirkung Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.