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 

Problem mit ifstream -> Einlesen von double-Werten

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





PostPosted: Wed Nov 12, 2003 9:01 am    Post subject: Problem mit ifstream -> Einlesen von double-Werten Reply with quote



Ich versuche eine Textdatei mit durch Leerzeichen getrennten double
Werten einzulesen (Linux, g++):

ifstream stream("test.dat");
double x;

while (!stream.eof()){
stream>>x;
cout < }
stream.close();

Statt fortlaufend einzulesen bekomme ich jedoch immer wieder die erste
Zahl und das Programm hängt in einer Endlosschleife. Wenn ich jedoch
double durch char ersetze, dann wird fortlaufend eingelesen und alles
funktioniert wunderbar.

Natürlich wäre es kein Problem erst in einen String einzulesen und dann
mittels atof eine Typkonvertierung durchzuführen, doch ich denke mir, es
müßte doch auch irgendwie so wie oben gehen. Hat da jemand nen
vorschlag, wie ich verhindern kann, daß nach dem einlesen einer Zahl
wieder zum Dateianfang zurückgesprungen wird? Kann man das irgendwie
einstellen?

Schon mal Danke ...

Lars

--
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
Markus Schaaf
Guest





PostPosted: Wed Nov 12, 2003 11:48 am    Post subject: Re: Problem mit ifstream -> Einlesen von double-Werten Reply with quote



"Lars Dietzel" <Skuld81 (AT) gmx (DOT) de> schrieb:

Quote:
ifstream stream("test.dat");
double x;

while (!stream.eof()){
stream>>x;
cout < }

Dein Beispielcode lautete richtig so:

ifstream s( "test.dat" );
double x;
while( s >> x ) cout << x << 'n';

Falls Du alle Werte auf einmal brauchst, liest Du sie gleich in einen
»vector« ein:

ifstream s( "test.dat" );
vector istream_iterator<double>() );

--
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
Stefan Reuther
Guest





PostPosted: Wed Nov 12, 2003 11:58 am    Post subject: Re: Problem mit ifstream -> Einlesen von double-Werten Reply with quote



Hallo,

Lars Dietzel <Skuld81 (AT) gmx (DOT) de> wrote:
Quote:
while (!stream.eof()){
stream>>x;

Pascal-Programmierer?

Der Zustand 'eof' wird _nicht_ gesetzt, wenn EOF erreicht wird,
sondern erst dann, wenn du versuchst, über das Ende des Streams
hinauszulesen. Außerdem rennt dein Code in eine Endlosschleife,
wenn in dem Stream kein gültiger double steht.

Ersetze das durch 'while (stream >> x)' und schon klappt's.

Quote:
cout < }

Hier wäre dann ein Test angebracht, ob das 'while (stream >> x)'
wegen EOF oder einem anderen Fehler abgebrochen wurde.

Vollständiges compilierbares und funktionierendes Programm:
-----8<-----
#include #include <fstream>
using namespace std;
int main()
{
ifstream stream("test.dat");
double x;
while (stream >> x){
cout < }
if (stream.eof()) cout << "eof erreichtn"; else cout << "anderer Fehlern";
stream.close();
}
-----8<-----


Stefan

--
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
Lars Dietzel
Guest





PostPosted: Wed Nov 12, 2003 1:33 pm    Post subject: Re: Problem mit ifstream -> Einlesen von double-Werten Reply with quote

Stefan Reuther wrote:
Quote:
Hallo,

Lars Dietzel <Skuld81 (AT) gmx (DOT) de> wrote:

while (!stream.eof()){
stream>>x;


Pascal-Programmierer?

Der Zustand 'eof' wird _nicht_ gesetzt, wenn EOF erreicht wird,
sondern erst dann, wenn du versuchst, über das Ende des Streams
hinauszulesen. Außerdem rennt dein Code in eine Endlosschleife,
wenn in dem Stream kein gültiger double steht.

Die Sache mit dem eof() funktioniert schon, denn nach dem letzten
double-Wert ist die Datei zu Ende und beim Versuch diesen zu lesen wird
eof() gesetzt. Das Problem war ein anderes: Das Leerzeichen zwischen den
double-Zeichenketten hat das Programm aus der Bahn geworfen. Durch
einfügen von

char c;

....
while ..

stream>>c;
....

hat sich das Problem erledigt. Trotzdem hab ich immer noch ein Problem:
Verwende ich eine Exponentenschreibweise wie z.B. 1.5E-3 dann liest das
Programm immer wieder den vorhergehenden Wert ein und bleibt hängen.
Dein Programm bricht mit der Meldung "anderer Fehler" ab. Ich hab auch
schon Varianten der Exponentenschreibweise probiert (kleines e,
Füllnullen beim Exponenten). Die gingen leider allesamt nicht. Weiss
jemand, woran das liegt/was ich falsch mache?

Lars

--
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: Wed Nov 12, 2003 4:21 pm    Post subject: Re: Problem mit ifstream -> Einlesen von double-Werten Reply with quote

Lars Dietzel <Skuld81 (AT) gmx (DOT) de> writes:

Quote:
Die Sache mit dem eof() funktioniert schon, denn nach dem letzten
double-Wert ist die Datei zu Ende und beim Versuch diesen zu lesen
wird eof() gesetzt. Das Problem war ein anderes: Das Leerzeichen
zwischen den double-Zeichenketten hat das Programm aus der Bahn
geworfen.

Unabhängig davon, ob Du einen "Work around" gefunden hast, gilt festzustellen,
dass Dein Programm (auch mit dem "Work around" fehlerhaft) und das von Stefan
vorgeschlagene korrekt ist.

Solange die Schlaufe vom Rückgabewert von eof() kontrolliert wird, besteht
die Gefahr, dass sie nie endet, wenn die Eingabeoperation wegen etwas anderem
als eof() scheitert.

Und wenn Du x rausschreibst, ohne zu überprüfen, ob die Eingabeoperation
erfolgreich war, greifst Du auf eine uninitialisierte Variable zu; ein
solcher Zugriff verursacht undefiniertes Verhalten.


Quote:
Weiss jemand, woran das liegt/was ich falsch mache?

Bleibt der Fehler, wenn Du obige Probleme korrigierst?

--
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
Lars Dietzel
Guest





PostPosted: Fri Nov 14, 2003 7:52 am    Post subject: Re: Problem mit ifstream -> Einlesen von double-Werten Reply with quote

Quote:
Lars Dietzel <Skuld81 (AT) gmx (DOT) de> writes:
Solange die Schlaufe vom Rückgabewert von eof() kontrolliert wird,
besteht
die Gefahr, dass sie nie endet, wenn die Eingabeoperation wegen etwas
anderem
als eof() scheitert.
Natürlich ist Stefans Programm die solidere Lösung. Nur kann ich davon

ausgehen, daß die Eingaben korrekt sind und deshalb ist mir das nicht so
wichtig. Stefans Programm birgt jedoch den Fehler, daß es das
Leerzeichen nicht "vernichtet". Deshalb bricht das Programm nach dem
ersten Wert ab (und mein Programm ist halt in einer Endlosschleife
gelandet). So oder so kam nicht das gewünschte Ergebnis raus. Stefans
Lösung läßt halt eine Behandlung des Problems zu. Das habe ich aber gar
nicht vor.

Quote:
Und wenn Du x rausschreibst, ohne zu überprüfen, ob die Eingabeoperation
erfolgreich war, greifst Du auf eine uninitialisierte Variable zu; ein
solcher Zugriff verursacht undefiniertes Verhalten.
So undefiniert ist das Verhalten nun auch nicht. Wenn die Variable noch

nicht initialisiert wurde (z.B. durch die letzte Leseoperation), dann
enthält x einen zufälligen Wert, der dann ausgeben wird. Dadurch kann
nur dann Unglück geschehen, wenn der falsche Inhalt weiterverwendet wird
und daraus z.B. falsche Berechnungen entstehen.

Quote:
Weiss jemand, woran das liegt/was ich falsch mache?


Bleibt der Fehler, wenn Du obige Probleme korrigierst?

Ja. Wenn ich das Leerzeichen überspringe, dann funktionieren beide
Programmversionen, solange die Zahlen keine Exponenten haben (also z.
1.34567, 3.2,5.9439048). Sobald aber eine Zahl mit Exponent eingelesen
werden soll, bricht Stefans Programm ab (und mein Programm liest immer
wieder die vorhergehende Zahl ein).

--
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
Stefan Reuther
Guest





PostPosted: Fri Nov 14, 2003 9:15 am    Post subject: Re: Problem mit ifstream -> Einlesen von double-Werten Reply with quote

Lars Dietzel <Skuld81 (AT) gmx (DOT) de> wrote:
Quote:
Lars Dietzel <Skuld81 (AT) gmx (DOT) de> writes:
Solange die Schlaufe vom Rückgabewert von eof() kontrolliert wird, besteht
die Gefahr, dass sie nie endet, wenn die Eingabeoperation wegen etwas anderem
als eof() scheitert.
Natürlich ist Stefans Programm die solidere Lösung. Nur kann ich davon
ausgehen, daß die Eingaben korrekt sind und deshalb ist mir das nicht so
wichtig. Stefans Programm birgt jedoch den Fehler, daß es das
Leerzeichen nicht "vernichtet". Deshalb bricht das Programm nach dem
ersten Wert ab (und mein Programm ist halt in einer Endlosschleife
gelandet).

Dann ist deine Bibliothek kaputt. Zumindest die Testdatei mit
dem Inhalt
----
1 2.5 3.14
33
-99
2
1.5e4
----
wird korrekt verarbeitet und ergibt
----
1
2.5
3.14
33
-99
2
15000
eof erreicht
----

Quote:
So oder so kam nicht das gewünschte Ergebnis raus. Stefans
Lösung läßt halt eine Behandlung des Problems zu. Das habe ich aber gar
nicht vor.

Das ist schlecht. Ein Programm sollte durchaus in der Lage sein,
'gute' und 'schlechte' Eingaben zu trennen.

Quote:
Und wenn Du x rausschreibst, ohne zu überprüfen, ob die Eingabeoperation
erfolgreich war, greifst Du auf eine uninitialisierte Variable zu; ein
solcher Zugriff verursacht undefiniertes Verhalten.
So undefiniert ist das Verhalten nun auch nicht. Wenn die Variable noch
nicht initialisiert wurde (z.B. durch die letzte Leseoperation), dann
enthält x einen zufälligen Wert, der dann ausgeben wird. Dadurch kann
nur dann Unglück geschehen,

Genau das *ist* undefiniertes Verhalten.

Quote:
Weiss jemand, woran das liegt/was ich falsch mache?


Bleibt der Fehler, wenn Du obige Probleme korrigierst?

Ja. Wenn ich das Leerzeichen überspringe, dann funktionieren beide
Programmversionen, solange die Zahlen keine Exponenten haben (also z.
1.34567, 3.2,5.9439048). Sobald aber eine Zahl mit Exponent eingelesen
werden soll, bricht Stefans Programm ab

Dann solltest du deine C++-Bibliothek wegwerfen und eine neue
kaufen.

Mein Programm, mit g++ übersetzt, überspringt selbständig
Leerzeichen, und behandelt Exponenten.

Ansonsten 'liest' dein Programm (while (!f.eof()) f >> x) immer
die letzte Zahl doppelt. Die letzte Zeile endet mit 'n'. Der
letzte 'f >> x' bleibt bei diesem 'n' stehen, ohne den Stream
in den Status 'eof' zu versetzen. Erst der nachfolgende 'f >> x'
versucht, whitespace (incl. 'n') zu überspringen und gelangt
damit ans EOF.


Stefan

--
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
Lars Dietzel
Guest





PostPosted: Fri Nov 14, 2003 9:55 am    Post subject: Re: Problem mit ifstream -> Einlesen von double-Werten Reply with quote

Oh, gut zu wissen. Dann sollte ich mal nachschauen, was da für
Bibliotheken eingebunden werden statt den Fehler in meinem Programm zu
suchen. Möglicherweise wird da irgendein Serververzeichnis mit
Uraltbibliotheken verwendet.

Ich hatte es ja auch erst wie Du versucht (vom eof() mal abgesehen),
aber das ging halt (bei mir) nicht. Dann erst mal danke ...

Lars

--
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: Fri Nov 14, 2003 6:08 pm    Post subject: Re: Problem mit ifstream -> Einlesen von double-Werten Reply with quote

Lars Dietzel <Skuld81 (AT) gmx (DOT) de> writes:

Quote:
Und wenn Du x rausschreibst, ohne zu überprüfen, ob die Eingabeoperation
erfolgreich war, greifst Du auf eine uninitialisierte Variable zu; ein
solcher Zugriff verursacht undefiniertes Verhalten.

So undefiniert ist das Verhalten nun auch nicht.

Ein wenig undefiniert gibt's nicht. Entweder definiert oder undefiniert (so
ähnlich wie bei schwanger).


Quote:
Wenn die Variable noch
nicht initialisiert wurde (z.B. durch die letzte Leseoperation), dann
enthält x einen zufälligen Wert, der dann ausgeben wird.

Oder Deine Festplatte wird formatiert.

--
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.