<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[C++  Datei schließen ?]]></title><description><![CDATA[<p>Hallo Leute mal eine Frage bzgl. Dateiarbeit... In vielen Büchern und Tutorials wird immer wieder Datei.close() verwendet.<br />
Nun bin ich mir nicht mehr ganz sicher, aber ich wage zu behaupten hier im Forum mal gelesen zu haben, das es eigentlich keine .close() braucht, da dies durch den Gültigkeitsbereich selbst erledigt wird?</p>
<p>Meine Frage nun, wann brauche in ein .close und wann nicht ?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;

void foo(){

std::ofsteam file(&quot;test.txt&quot;, std::ios_base::app);

//do sth. with file

file.close()  // braucht es nicht, da file am Ende von foo &quot;zerstört&quot; wird oder?
}
</code></pre>
<p>... oder sollte man sicherheitshalber einfach mal ein .close setzten ?</p>
<p>Wie siehts bei einer Klasse aus, die im Konstruktor eine Datei öffnet, muss ich die im Destruktor selbst schließen oder läuft das so mit ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/331603/c-datei-schließen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 16:56:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/331603.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Mar 2015 14:57:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++  Datei schließen ? on Mon, 09 Mar 2015 14:57:52 GMT]]></title><description><![CDATA[<p>Hallo Leute mal eine Frage bzgl. Dateiarbeit... In vielen Büchern und Tutorials wird immer wieder Datei.close() verwendet.<br />
Nun bin ich mir nicht mehr ganz sicher, aber ich wage zu behaupten hier im Forum mal gelesen zu haben, das es eigentlich keine .close() braucht, da dies durch den Gültigkeitsbereich selbst erledigt wird?</p>
<p>Meine Frage nun, wann brauche in ein .close und wann nicht ?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;

void foo(){

std::ofsteam file(&quot;test.txt&quot;, std::ios_base::app);

//do sth. with file

file.close()  // braucht es nicht, da file am Ende von foo &quot;zerstört&quot; wird oder?
}
</code></pre>
<p>... oder sollte man sicherheitshalber einfach mal ein .close setzten ?</p>
<p>Wie siehts bei einer Klasse aus, die im Konstruktor eine Datei öffnet, muss ich die im Destruktor selbst schließen oder läuft das so mit ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446046</guid><dc:creator><![CDATA[cpp_beginner]]></dc:creator><pubDate>Mon, 09 Mar 2015 14:57:52 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Mon, 09 Mar 2015 15:04:21 GMT]]></title><description><![CDATA[<p>Der Destruktor von std::ofstream erledigt den close(), wenn er ausgeführt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446047</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 09 Mar 2015 15:04:21 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Mon, 09 Mar 2015 18:51:54 GMT]]></title><description><![CDATA[<p>Ah, die alte &quot;ist <code>file.close()</code> zu was gut&quot; Frage.</p>
<p><code>file.close()</code> wegzulassen ist grundsätzlich eine Unart. Der Nachteil beim Weglassen von <code>file.close()</code> wird bloss dadurch &quot;maskiert&quot;, dass iostreams per Default so eingestellt sind dass bei Fehlern keine Exceptions geworfen werden.</p>
<p>iostreams tun nämlich Daten puffern. Was zur Folge hat dass <code>close</code> wesentlich mehr machen kann als bloss Speicher bzw. allgemein Resourcen freigeben. Nämlich die letzten paar Daten, die noch gepuffert sind und noch nicht geschrieben wurden, rausschreiben, bevor das File dann geschlossen wird. Was fehlschlagen kann. Was man normalerweise mitbekommen möchte.</p>
<p>=&gt;<br />
Entweder Exceptions auf dem <code>ostream</code> aktivieren und vor Programmende selbst <code>close</code> aufrufen.<br />
Oder vor Programmende <code>flush</code> aufrufen und dann nochmal den Stream-State prüfen.</p>
<p>Nur <code>close</code> ohne aktive Exceptions bringt natürlich wirklich nichts. Dann kann man es genau so gut gleich weglassen. Was mMn. aber die schlechteste aller Lösungen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446089</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 09 Mar 2015 18:51:54 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Mon, 09 Mar 2015 19:06:34 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><code>file.close()</code> wegzulassen ist grundsätzlich eine Unart.</p>
</blockquote>
<p>Nö.<br />
Das Problem ist grundsätzlich ungelöst. Was machste mit zwei Files in zwei unterschiedlich tiefen Funktionen? close() muss einfach klappen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446090</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 09 Mar 2015 19:06:34 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Mon, 09 Mar 2015 19:00:40 GMT]]></title><description><![CDATA[<blockquote>
<p>Oder vor Programmende flush aufrufen und dann nochmal den Stream-State prüfen.</p>
</blockquote>
<p>? So :</p>
<pre><code>file.flush;

if (!file.fail){
     file.close();
}
</code></pre>
<p>?? Oder wie meinst du das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446091</guid><dc:creator><![CDATA[cpp_beginner_offl]]></dc:creator><pubDate>Mon, 09 Mar 2015 19:00:40 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Mon, 09 Mar 2015 19:54:46 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p><code>file.close()</code> wegzulassen ist grundsätzlich eine Unart.</p>
</blockquote>
<p>Nö.<br />
Das Problem ist grundsätzlich ungelöst.</p>
</blockquote>
<p>Nö.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Was machste mit zwei Files in zwei unterschiedlich tiefen Funktionen?</p>
</blockquote>
<p>Beim tieferen (inneren) close() fliegt ne Exception.<br />
Dadurch wird das äussere File vom Dtor geschlossen. Was effektiv ein &quot;abort&quot; ist, also ein &quot;versuchs bitte aber ignorier' alle Fehler&quot; Schliessen.<br />
Der Inhalt beider Files ist potentiell kaputt. Aber - sofern das OS kein kompletter Schrott ist: beide Handles wurden freigegeben, beide Files sind also &quot;geschlossen&quot;.</p>
<p>Irgendwo wird die Exception gefangen und dem User angezeigt. Jetzt weiss er dass die Files möglicherweise Schrott enthalten.</p>
<p>=&gt; Problem gelöst.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>close() muss einfach klappen.</p>
</blockquote>
<p>Und was wenn nicht? Geht dann die Welt unter?<br />
=&gt; Unsinn.</p>
<p>Es geht nicht darum zu garantieren dass immer alles gut geht. Das kann man nicht. Es geht darum zu garantieren dass man nur dann &quot;haben fertig, alles OK&quot; sagt, wenn auch wirklich alles OK ist. Und das ist nicht grundsätzlich ungelöst, sondern sogar sehr einfach zu lösen. Nur halt nicht &quot;sehr einfach&quot; mit den iostreams, weil sie den falschen Default-Wert für die Exceptions-Maske haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446099</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 09 Mar 2015 19:54:46 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Mon, 09 Mar 2015 19:48:24 GMT]]></title><description><![CDATA[<p>cpp_beginner_offl schrieb:</p>
<blockquote>
<p>? So :</p>
<pre><code>file.flush;

if (!file.fail){
     file.close();
}
</code></pre>
<p>?? Oder wie meinst du das?</p>
</blockquote>
<p>Nein.<br />
Eher so:</p>
<pre><code>file.flush();
if (!file)
    throw std::runtime_error(&quot;Waaaaaaaah, MIST!&quot;);
</code></pre>
<p>Bzw. auch gerne als</p>
<pre><code>if (!file.flush())
    throw std::runtime_error(&quot;Waaaaaaaah, MIST!&quot;);
</code></pre>
<p>geschrieben.</p>
<p>Nach dem <code>flush()</code> kann man das File dann ruhig über den Dtor schliessen lassen. Alle Änderungen wurden ja bereits geschrieben, d.h. es gibt im Dtor nix mehr zu tun was schief gehen könnte.<br />
Oder anders gesagt: es können keine Fehler mehr passieren von denen man erfahren wollen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446102</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 09 Mar 2015 19:48:24 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Mon, 09 Mar 2015 20:05:17 GMT]]></title><description><![CDATA[<p>Ich hab mal kurz in der Onlinerefernz zu flush nachgelesen...</p>
<p><a href="http://www.cplusplus.com/reference/ostream/ostream/flush/" rel="nofollow">http://www.cplusplus.com/reference/ostream/ostream/flush/</a></p>
<p>Ok, Return Value *this, darum prüfst du auf (!file)...<br />
Es steht aber, wenn ich auf die schnelle richtig übersetzt habe , auch drinn, das verschiedene Failstates gesetzt werden.</p>
<p>Würde</p>
<pre><code>if (file.fail() ){
    throw std::runtime_error (&quot;Sth. really bad happened...&quot;);
}
</code></pre>
<p>genauso funktionieren oder ist es &quot;sicherer&quot; auf (!file) zu prüfen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446105</guid><dc:creator><![CDATA[beg_offl]]></dc:creator><pubDate>Mon, 09 Mar 2015 20:05:17 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Mon, 09 Mar 2015 20:12:02 GMT]]></title><description><![CDATA[<p>Laut <a href="http://www.cplusplus.com/reference/ios/ios/operator_not/" rel="nofollow">http://www.cplusplus.com/reference/ios/ios/operator_not/</a> ist !stream equivalent zu fail()</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446106</guid><dc:creator><![CDATA[tkausl]]></dc:creator><pubDate>Mon, 09 Mar 2015 20:12:02 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 01:45:59 GMT]]></title><description><![CDATA[<p>Hab selbst grad noch ein wenig nachgelesen/rumprobiert.<br />
Noch besser wäre gleich <code>close</code> aufzurufen und danach den Stream-State zu prüfen.<br />
Also</p>
<pre><code class="language-cpp">file.close(); // liefert nicht den Stream zurück, geht daher nicht direkt im if
if (!file)
    throw std::runtime_error(&quot;Waaaaaaaah, MIST!&quot;);
</code></pre>
<p><code>close</code> setzt nämlich im Falle des Falles auch das <code>fail</code> Bit, und das Prüfen des Stream-States scheint auch nach dem Schliessen des Files erlaubt zu sein.<br />
=&gt; Besser als die <code>flush()</code> Variante, da man keine Vermutung mehr darüber anstellen muss ob <code>close</code> nach erfolgreichem <code>flush</code> noch fehlschlagen kann/darf oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446136</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 10 Mar 2015 01:45:59 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 02:09:25 GMT]]></title><description><![CDATA[<p>Dir ist schon klar, dass jetzt viele Leute diesen Code wortwörtlich kopieren werden und dann stolz meinen werden, dass</p>
<pre><code>throw std::runtime_error(&quot;Waaaaaaaah, MIST!&quot;);
</code></pre>
<p>eine bessere Art der Fehlerbehandlung wäre, als das ganze Thema einfach zu ignorieren und gar kein close zu setzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446139</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 10 Mar 2015 02:09:25 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 02:17:44 GMT]]></title><description><![CDATA[<p>Also wer die Fehlermeldung 1:1 übernimmt, dem kann ich auch nicht helfen.</p>
<p>Gibt es vom Text <code>&quot;Waaaaaaaah, MIST!&quot;</code> abgesehen noch etwas zu kritisieren?</p>
<p>ps: Schlag ne bessere Fehlermeldung vor, und ich kopier' sie rein (bzw. fühl dich frei es selbst reinzueditieren wenn du es für wichtig bzw. sinnvoll erachtest).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446141</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 10 Mar 2015 02:17:44 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 02:33:27 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Also wer die Fehlermeldung 1:1 übernimmt, dem kann ich auch nicht helfen.</p>
<p>Gibt es vom Text <code>&quot;Waaaaaaaah, MIST!&quot;</code> abgesehen noch etwas zu kritisieren?</p>
</blockquote>
<p>Ich meine eher, dass das reine Werfen der Exception in diesem Fall nicht viel bringt, wenn sie nicht auch sinnvoll behandelt wird. Was bringt mir eine ungefangene Exception und Datenverlust gegenüber einfach nur Datenverlust?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446142</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 10 Mar 2015 02:33:27 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 03:06:20 GMT]]></title><description><![CDATA[<p>Hm.<br />
Verstehe ich jetzt nicht ganz wieso du das als Problem siehst.</p>
<p>Ich bin schon der Meinung dass es deutlich besser ist wenn ein Programm im Fehlerfall mit einer Fehlermeldung der CRT bzw. des OS abbricht, als wenn es im Fehlerfall &quot;OK, haben fertig, alles gut&quot; hinschreibt.<br />
Du nicht?<br />
Ich finde falsche Erfolgsmeldungen halt schon <em>sehr</em> schlimm.</p>
<p>Natürlich ist es meistens besser die Exception irgendwo zu fangen. Nur wie und wo man Exceptions sinnvoll behandelt würde hier mMn. deutlich den Rahmen sprengen. Und einfach nur ein try-catch um die ganze Show drumrumschreiben würde das Beispiel wohl kaum signifikant verbessern. Da das im Falle des Falles dann auch 1:1 mitkopiert wird, auch wenn es in dem Programm wo es reinkopiert wird an der Stelle wo es dann landet total deplaziert ist.</p>
<p>Mir ging es lediglich darum eine bessere Alternative zu &quot; <code>close</code> einfach weglassen&quot; aufzuzeigen. Vor allem da man leider so oft Tips wie &quot; <code>close</code> brauchst du nicht&quot; lesen muss. (Was für <code>ifstream</code> ja OK ist, aber halt nicht für <code>ofstream</code> .)</p>
<p>ps:<br />
Wäre es deiner Meinung nach besser in solchen Beispielen etwas ala</p>
<pre><code class="language-cpp">file.close(); // liefert nicht den Stream zurück, geht daher nicht direkt im if 
if (!file)
{
    // TODO: Fehler behandeln
}
</code></pre>
<p>zu schreiben?<br />
Oder hast du nen anderen, besseren Vorschlag?<br />
Aufruf einer im Beispiel nicht definierten Funktion mit beschreibendem Namen ala <code>DateiSchreibeFehlerBehandeln()</code> vielleicht? Damit der Code nach 1:1 copy+paste wenigstens nicht compiliert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446144</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 10 Mar 2015 03:06:20 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 04:04:14 GMT]]></title><description><![CDATA[<p>Ich hätte es halt besser gefunden, wenn du ein bisschen auf mögliche Reaktionen auf den möglichen Fehler eingegangen wärst, denn</p>
<pre><code>}
</code></pre>
<p>= schlecht</p>
<p>und</p>
<pre><code>file.close(); 
  if (!file)
    throw std::runtime_error(&quot;Waaaaaaaah, MIST!&quot;);	
}
</code></pre>
<p>= besser</p>
<p>trifft es nicht wirklich. Da fehlt zu viel Drumherum, um dem Niveau der Frage gerecht zu werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446147</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 10 Mar 2015 04:04:14 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 06:04:30 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Da fehlt zu viel Drumherum, um dem Niveau der Frage gerecht zu werden.</p>
</blockquote>
<p>Welches Drumherum, das direkt mit der Frage des OP in Zusammenhang steht, geht dir ab?</p>
<p>Ich finde es auch einigermassen anstrengend dass du nicht sagst was dir eigentlich nicht passt/abgeht/.... Und zu guter Letzt: wenn etwas wichtiges fehlt, dann ergänze es doch einfach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446149</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 10 Mar 2015 06:04:30 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 06:30:10 GMT]]></title><description><![CDATA[<p>Ich kann nicht sagen, was da fehlt, ist schließlich deine Antwort. Du antwortest auf dem Niveau professioneller Entwicklung, wo Datenkonsistenz sicher gestellt werden muss, erklärst aber nur, wie du einen eventuellen Datenverlust überhaupt feststellst. Der Fragesteller will hingegen vermutlich eher wissen, ob seine Datei überhaupt zu geht. Deine Antwort sieht so aus, als solle der Fragesteller den Code</p>
<pre><code>file.close();
  if (!file)
    throw std::runtime_error(&quot;Waaaaaaaah, MIST!&quot;);
</code></pre>
<p>in seinen Anfängerprogrammen übernehmen und sie würden dadurch automatisch irgendwie besser dadurch, dass er nun eine ungefangene Exception erhält, wenn ihm irgendjemand den Datenträger abzieht, während er &quot;Hello World&quot; in eine Datei schreiben möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446150</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 10 Mar 2015 06:30:10 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 09:12:59 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ich kann nicht sagen, was da fehlt, ist schließlich deine Antwort. Du antwortest auf dem Niveau professioneller Entwicklung, wo Datenkonsistenz sicher gestellt werden muss, erklärst aber nur, wie du einen eventuellen Datenverlust überhaupt feststellst. <strong>Der Fragesteller will hingegen vermutlich</strong> eher wissen, ob seine Datei überhaupt zu geht. Deine Antwort sieht so aus, als solle der Fragesteller den Code</p>
<pre><code>file.close();
  if (!file)
    throw std::runtime_error(&quot;Waaaaaaaah, MIST!&quot;);
</code></pre>
<p>in seinen Anfängerprogrammen übernehmen und sie würden dadurch automatisch irgendwie besser dadurch, dass er nun eine ungefangene Exception erhält, wenn ihm irgendjemand den Datenträger abzieht, während er &quot;Hello World&quot; in eine Datei schreiben möchte.</p>
</blockquote>
<p>Sorry Sepp, du vermutest zu viel.<br />
Die Erklärung von hustbaer fand ich jetzt nicht schlecht. Es geht mir nicht darum in Erfahrung zu bringen ob meine Datei geschlossen wird, sondern wie im Anfangsthread schon geschreiben, wann ein .close sinnvoll ist oder eben nicht usw usw.</p>
<blockquote>
<p>Ich meine eher, dass das reine Werfen der Exception in diesem Fall nicht viel bringt, wenn sie nicht auch sinnvoll behandelt wird. Was bringt mir eine ungefangene Exception und Datenverlust gegenüber einfach nur Datenverlust?</p>
</blockquote>
<p>Das jmd. mitbekommt das jetzt was schiefgegangen ist ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446159</guid><dc:creator><![CDATA[beg_offl]]></dc:creator><pubDate>Tue, 10 Mar 2015 09:12:59 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 13:42:53 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Hab selbst grad noch ein wenig nachgelesen/rumprobiert.<br />
Noch besser wäre gleich <code>close</code> aufzurufen und danach den Stream-State zu prüfen.<br />
Also</p>
<pre><code class="language-cpp">file.close(); // liefert nicht den Stream zurück, geht daher nicht direkt im if
if (!file)
    throw std::runtime_error(&quot;Waaaaaaaah, MIST!&quot;);
</code></pre>
<p><code>close</code> setzt nämlich im Falle des Falles auch das <code>fail</code> Bit, und das Prüfen des Stream-States scheint auch nach dem Schliessen des Files erlaubt zu sein.<br />
=&gt; Besser als die <code>flush()</code> Variante, da man keine Vermutung mehr darüber anstellen muss ob <code>close</code> nach erfolgreichem <code>flush</code> noch fehlschlagen kann/darf oder nicht.</p>
</blockquote>
<p>Jetzt hast du aber wieder alle Nachteile des manuellen Aufräumens. Stell dir mal vor, eine andere Exception (die später gefangen wird und der User vermutet nicht, dass die Datei fehlerhaft ist) wird geworfen. Dann ists vorbei mit deiner Aufräumaktion. Wenn also nichts anderes dagegenspricht, sollte man denke ich direkt die Exceptionmaske für den ofstream richtig setzen und auf close() verzichten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446188</guid><dc:creator><![CDATA[m.e.]]></dc:creator><pubDate>Tue, 10 Mar 2015 13:42:53 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 14:30:47 GMT]]></title><description><![CDATA[<p>m.e. schrieb:</p>
<blockquote>
<p>Stell dir mal vor, eine andere Exception (die später gefangen wird und der User vermutet nicht, dass die Datei fehlerhaft ist) wird geworfen.</p>
</blockquote>
<p>Diesen Satz verstehe ich nicht. Kannst du das in (Pseude-)Code skizzieren?</p>
<p>m.e. schrieb:</p>
<blockquote>
<p>Wenn also nichts anderes dagegenspricht, sollte man denke ich direkt die Exceptionmaske für den ofstream richtig setzen und auf close() verzichten.</p>
</blockquote>
<p>Soll mir auch Recht sein.<br />
Mir ist hauptsächlich wichtig dass die Leute wissen warum es ein Fehler ist einfach nix zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446196</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 10 Mar 2015 14:30:47 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 15:03:13 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>m.e. schrieb:</p>
<blockquote>
<p>Stell dir mal vor, eine andere Exception (die später gefangen wird und der User vermutet nicht, dass die Datei fehlerhaft ist) wird geworfen.</p>
</blockquote>
<p>Diesen Satz verstehe ich nicht. Kannst du das in (Pseude-)Code skizzieren?</p>
</blockquote>
<pre><code class="language-cpp">try
{
	ofstream file(&quot;simulation_results.txt&quot;);

	for(int i = 0; i &lt; 10; ++i)
	{
	    file &lt;&lt; runSimulation(i);
	    notifyUser(&quot;Simulation &quot; + to_string(i) + &quot; abgeschlossen. Ergebnisse geschrieben.&quot;);
	}
	file.close(); // liefert nicht den Stream zurück, geht daher nicht direkt im if
	if (!file)
	    throw std::runtime_error(&quot;Waaaaaaaah, MIST!&quot;);
}
catch(SimulationFailedException&amp;)
{
	notifyUser(&quot;Eine Simulation ist gescheitert. Alle vorherigen wurden gespeichert.&quot;);  // Hier lügen wir den User an.
}
</code></pre>
<p>Natürlich könnte man das Problem auf einfache Weise beheben. Aber mit gesetzen Ostream-Exceptions würde es erst gar nicht zum Problem kommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446200</guid><dc:creator><![CDATA[m.e.]]></dc:creator><pubDate>Tue, 10 Mar 2015 15:03:13 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 15:20:12 GMT]]></title><description><![CDATA[<blockquote>
<p>Natürlich könnte man das Problem auf einfache Weise beheben. Aber mit gesetzen Ostream-Exceptions würde es erst gar nicht zum Problem kommen.</p>
</blockquote>
<p>Könntest du das bitte auch kurz darlegen ? Die &quot;einfache&quot; Weise, udn wie man die Ostream-Exceptions &quot;einschaltet&quot; ... Ich find das irgendwie nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446204</guid><dc:creator><![CDATA[beg_offl]]></dc:creator><pubDate>Tue, 10 Mar 2015 15:20:12 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 16:05:34 GMT]]></title><description><![CDATA[<p>@m.e.<br />
OK, danke, verstehe.<br />
Ja, es gibt Leute die auf die Idee kommen könnten solchen Code zu schreiben. Der einfachste &quot;Fix&quot; ist dabei aber mMn. keinen &quot;komischen&quot; Code zu schreiben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>@beg_offl<br />
<a href="http://en.cppreference.com/w/cpp/io/basic_ios/exceptions" rel="nofollow">http://en.cppreference.com/w/cpp/io/basic_ios/exceptions</a></p>
<pre><code class="language-cpp">myStream.exceptions(std::ios::failbit | std::ios::badbit);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2446211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446211</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 10 Mar 2015 16:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 16:17:02 GMT]]></title><description><![CDATA[<p>m.e. schrieb:</p>
<blockquote>
<p>Wenn also nichts anderes dagegenspricht, sollte man denke ich direkt die Exceptionmaske für den ofstream richtig setzen und auf close() verzichten.</p>
</blockquote>
<p>Der Destruktor wirft nie irgendwas (und wenn, dann hast du ein). Das close() musst du deshalb immer noch hinschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446213</guid><dc:creator><![CDATA[throwingdestructor]]></dc:creator><pubDate>Tue, 10 Mar 2015 16:17:02 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 16:17:48 GMT]]></title><description><![CDATA[<p>* und wenn, dann hast du ein <em>Problem</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446214</guid><dc:creator><![CDATA[throwingdestructor]]></dc:creator><pubDate>Tue, 10 Mar 2015 16:17:48 GMT</pubDate></item><item><title><![CDATA[Reply to C++  Datei schließen ? on Tue, 10 Mar 2015 19:33:08 GMT]]></title><description><![CDATA[<p>throwingdestructor schrieb:</p>
<blockquote>
<p>m.e. schrieb:</p>
<blockquote>
<p>Wenn also nichts anderes dagegenspricht, sollte man denke ich direkt die Exceptionmaske für den ofstream richtig setzen und auf close() verzichten.</p>
</blockquote>
<p>Der Destruktor wirft nie irgendwas (und wenn, dann hast du ein). Das close() musst du deshalb immer noch hinschreiben.</p>
</blockquote>
<p>Uff, ja, good catch!<br />
Hab ich einfach drübergelesen.<br />
Ja, der iostreams Dtor wirft, eben wie ein braver Dtor, niemals Exceptions!</p>
<p>BTW: close() ist auch &quot;brav&quot;. Falls der implizite Flush in close() schief geht, und die Exception-Maske verlangt dass eine Exception geworfen wird, dann tut close() trotzdem vor dem Werfen der Exception noch das Handle schliessen. Ist zwar ein etwas &quot;eigenwilliges&quot; Verhalten, aber wenn man drüber nachdenkt ... die Alternative das Handle in dem Fall nicht zu schliessen wäre viel schlimmer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2446227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2446227</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 10 Mar 2015 19:33:08 GMT</pubDate></item></channel></rss>