ofstream | Auch prüfen beim schließen?
-
Folgendes, wenn ich jetzt einen stream erstelle, also z.B.:
ofstream file; file.open("D:\Buch.txt");dann prüft man danach immer gleich ob es verbunden ist oder ob irgendwelche Komplikationen aufgetaucht sind:
if(file) cout << "Okay!\n"; else cout << "Error!\n";So, wie sieht das jetzt aber beim schließen aus, - also bei file.close() - gibts da auch eine Möglich keit zu prüfen, oder prüft man da einfach gar nicht, weil dass immer gut geht?
Oder macht man da auch wieder sowas wie oben if(file)....?MfG
Stromberg
-
Hi Stromberg,
http://www.cplusplus.com/reference/iostream/ofstream/close.html
On failure, the failbit internal state flag is set (which can be checked with member fail), and depending on the value set with exception an exception may be thrown.
if(file) überprüft ja dieses failbit
--> Die Überprüfung ist sinnvoll,The function fails if no file is currently open (associated) with this object.
Wenn die Datei definitv geöffnet ist, kannst du dir die Abfrage scheinbar
sparen.bezüglich der Exception:
http://www.cplusplus.com/reference/iostream/ios/exceptions.html
Gruß,
CSpille
-
if (file)Dabei nutzt du operator void* (http://www.cplusplus.com/reference/iostream/ios/operator_voidpt.html) um zu gucken, ob der Stream in Ordnung ist. Wenn das fail- oder badbit gesetzt ist, gibt der operator void* von std::ios (std::fstream erbt davon) NULL zurück.
if (!file)So nutzt du operator! (http://www.cplusplus.com/reference/iostream/ios/operatornot.html), der, wenn fail- und/oder badbit gesetzt sind, true zurück gibt, sonst false.
So kannst du direkt auf "Fehlschlag" testen.Durch http://www.cplusplus.com/reference/iostream/ios_base/register_callback.html sollte std::fstream::close mit dem Destruktor http://www.cplusplus.com/reference/iostream/ios_base/~ios_base.html verknüpft sein und somit den Stream schließen.
<a href= schrieb:
http://www.cplusplus.com/reference/iostream/fstream/close.html">The function fails if no file is currently open (associated) with this object.
Da die Funktion aber als Rückgabetyp void hat, gehe ich davon aus, dass Exceptions gemeint sind.
Hab jetzt nichts genaueres gefunden. Es wird halt vom assoziierten Stream-Buffer (http://www.dinkumware.com/manuals/default.aspx?manual=compleat&page=fstream.html#basic_filebuf) die Funktion close aufgerufen, die halt this zurückgibt, wenn Sie erfolgreich war. Im Fehlerfall NULL. http://www.dinkumware.com/manuals/default.aspx?manual=compleat&page=fstream.html#basic_filebuf::close
Von d.h. wird das wahrscheinlich durch sowas getestet:void basic_fstream<_Type>::close() { if (&m_buffer != m_buffer.close()) throw std::basic_iostream::exception; }Welche Exception jetzt genau ... weiß icht nicht ... probier es einfach aus!

Aber normal brauchst du dich garnicht um das alles kümmern:
{ std::ofstream file_stream("D:\\Buch.txt"); } // file_stream destruktor wird aufgerufen (da Scope zu ende) und ggf. close aufgerufen.
-
Also folgendes müsste doch dann auch möglich sein:
fstream object; void *p; p=reintrepret_cast<void*>(&object); if(p) cout << "Flags set\n"; //one of the error flags (failbit or badbit) is set else cout << "no Error Flag is set";Kann ich mir das so vorstellen!?
MfG
Strombergangelehnt an den link: http://www.cplusplus.com/reference/iostream/ios/operator_voidpt.html
-
Damit führst Du eine Umwandlung von fstream* nach void* durch, nicht von fstream nach void*. Das sind zwei unterschiedliche paar Schuhe.
-
Wie würde der Code dann richtig heißen?
MfG
Stromberg
-
fstream object; void *p; p = object; if(p) cout << "Flags set\n"; //one of the error flags (failbit or badbit) is set else cout << "no Error Flag is set";Dies funktioniert jedenfalls bei mingw/gcc.
Allerdings muss es if(!p) heißen, da bei einem gesetzten Error-Flag NULL zurückgegeben wird. (Wie (D)evil schon sagte)
-
Aber in dem Link stand doch irgendwas mit "casten":
A stream object derived from ios can be casted to a pointer.
http://www.cplusplus.com/reference/iostream/ios/operator_voidpt.html
Oder was ist damit gemeint?
MfG
Stromberg
-
Hmm http://www.google.com/search?hl=en&q=C%2B%2B+overloading+type+cast+operator&btnG=Search
schonmal was von type cast operator gehört? Es kümmert sich darum, dass du für einen bestimmten Typ das casten in diesen erlauben kannst. D.h. ist hier die implizite Umwandlung möglich & io.
-
(D)Evil schrieb:
Durch http://www.cplusplus.com/reference/iostream/ios_base/register_callback.html sollte std::fstream::close mit dem Destruktor http://www.cplusplus.com/reference/iostream/ios_base/~ios_base.html verknüpft sein und somit den Stream schließen.
<a href= schrieb:
http://www.cplusplus.com/reference/iostream/fstream/close.html">The function fails if no file is currently open (associated) with this object.
Da die Funktion aber als Rückgabetyp void hat, gehe ich davon aus, dass Exceptions gemeint sind.
Hab jetzt nichts genaueres gefunden. Es wird halt vom assoziierten Stream-Buffer (http://www.dinkumware.com/manuals/default.aspx?manual=compleat&page=fstream.html#basic_filebuf) die Funktion close aufgerufen, die halt this zurückgibt, wenn Sie erfolgreich war. Im Fehlerfall NULL. http://www.dinkumware.com/manuals/default.aspx?manual=compleat&page=fstream.html#basic_filebuf::close
Von d.h. wird das wahrscheinlich durch sowas getestet:void basic_fstream<_Type>::close() { if (&m_buffer != m_buffer.close()) throw std::basic_iostream::exception; }Welche Exception jetzt genau ... weiß icht nicht ... probier es einfach aus!

die exception, die geworfen wird, ist ios_base::failure. die wird allerdings auch nur gerufen, wenn du zuvor exceptions aktiviert hast - und zwar mit:
stream.exceptions (ios_base::failbit)ansonsten wird einfach nur das failbit gesetzt.
und besser noch: wenn man nicht close aufruft, sondern den destruktor von fstream die aufräumarbeiten übernehmen lässt, wird nicht einmal eine exception geworfen. (exceptions in destruktoren sind böse)
-

Aber normal brauchst du dich garnicht um das alles kümmern:
{ std::ofstream file_stream("D:\\Buch.txt"); } // file_stream destruktor wird aufgerufen (da Scope zu ende) und ggf. close aufgerufen.
-
Was ist denn wenn beim Schließen festgestellt wird, dass der noch nicht vollständig weggeschriebene Puffer nicht mehr geschrieben werden kann? Ich nehme doch mal an, dann würde auch beim close ein failbit gesetzt werden, welches zu überprüfen durchaus Sinn machen würde, oder?
-
Ja, das macht Sinn und wenn man denselben Stream wiederöffnen will, so sollte man vorher die Statusflags wieder löschen (sonst erlebt man eine unangenehme Überraschung - Datei kann nicht geöffnet werden, obwohl vorhanden):
fstream f("datei"); ... f.close(); f.clear(); // wichtig hier f.open("datei2"); ... f.close();