end of file, wenn der Stream Exceptions wirft
-
while( !stream.eof() ) { char x = stream.get(); cout << x; }Folgender Code wirft eine Exception beim Lesen über das letzte Zeichen hinaus. Leider sind fast alle Beispiele darauf ausgelegt, dass der Stream keine Exception wirft und die nehmen dann einfach das letzte Zeichen nicht sobald eof() true ergibt. Wie ist der elegante C++-Weg, wenn der Stream auf Exceptions eingestellt ist?
-
-
thx
-
Nein, hilft nicht, denn die Beschreibung dort verhindert, falls ich es richtig verstanden habe, nicht die Exception. Wahrscheinlich würde beim Fangen der Exception der Test auf eof() dann passen, aber ich will keine Exception für EOF haben.
-
Du kannst dem Stream sagen, bei welchen (Fehler-)Zuständen er exceptions werfen soll:
Du brauchst dementsprechend:strm.exceptions (std::ios::failbit | std::ios::badbit);Dann sollten "echte" Fehler noch exceptions generieren, eof aber nicht.
Den alten Zustand kannst Du Dir vorher mit strm.exceptions() merken und am Ende zurücksetzen.Der entsprechende Text aus N. Josuttis "C++ Standard Library, The: A Tutorial and Reference"
Calling exceptions() without an argument yields the current flags for which exceptions are triggered. No exceptions are thrown if the function returns goodbit. This is the default, to maintain backward compatibility. When exceptions() is called with an argument, exceptions are thrown as soon as the corresponding state flags are set. If a state flag is already set when exceptions() is called with an argument, an exceptions is thrown if the corresponding flag is set in the argument.
The following example configures the stream so that, for all flags, an exception is thrown:
// throw exceptions for all "errors"
strm.exceptions (std::ios::eofbit | std::ios::failbit |
std::ios::badbit);If 0 or goodbit is passed as an argument, no exceptions are generated:
// do not generate exceptions
strm.exceptions (std::ios::goodbit);Exceptions are thrown when the corresponding state flags are set after calling clear() or setstate(). An exception is even thrown if the flag was already set and not cleared:
// this call throws an exception if failbit is set on entry
strm.exceptions (std::ios::failbit);
...
// throw an exception (even if failbit was already set)
strm.setstate (std::ios::failbit);
-
niemand schrieb:
Du kannst dem Stream sagen, bei welchen (Fehler-)Zuständen er exceptions werfen soll:
Du brauchst dementsprechend:strm.exceptions (std::ios::failbit | std::ios::badbit);Dann sollten "echte" Fehler noch exceptions generieren, eof aber nicht.
Den alten Zustand kannst Du Dir vorher mit strm.exceptions() merken und am Ende zurücksetzen. [...]Wenn ich die eof-Exception ganz abstelle, krieg ich sie auch nicht, wenn ich 20 Bytes über das Dateiende hinauslese und da möchte ich sie schon ganz gerne haben. Also ist abstellen für mich keine Option.
Also letztlich möchte ich meine Frage nochmal präzisieren, kann man das Dateiende feststellen, ohne darüber hinauszulesen? Und ich vermute schon die Antwort...
Ok, muss ich wohl akzeptieren.thx
-
Wirft auch peek? Ich würde es für logisch halten wenn.
while(in.peek() != EOF)nicht werfen würde jedoch bei den iostreams weiß man nie.
Mein ganz persöhnlicher Rat und Meinung ist es diese Streams einfach in die Tonne zu treten.
-
Die Option, sie in die Tonne zu treten, habe ich leider auch nicht, weil ich das für die Uni mache.
Aber ich kann scheinbar bis zum EOF seeken. Ich werde Morgen mal schaun, ob mir das nützlich ist.