<?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[fstream: Blockweises Einlesen mit read so richtig?]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich wollte mal fragen ob dieser Code korrekt ist:</p>
<pre><code class="language-cpp">std::ifstream file(&quot;C:\\test.dat&quot;, std::ios::binary);

char buffer[256];

do
{
	file.read(buffer, sizeof(buffer));

	if(file.fail())
	{
		// Exception werfen (?)
	}

	// buffer bearbeiten
} while(!file.eof());
</code></pre>
<p>Also vor allen Dingen das mit eof und fail. HumeSikkins beschreibt in seiner FAQ was man beachten muss: <a href="http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&amp;faq=eof#Answ" rel="nofollow">http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&amp;faq=eof#Answ</a></p>
<p>Aber leider ist dort kein Beispiel wie man es richtig macht. (oder ich habs übersehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/118291/fstream-blockweises-einlesen-mit-read-so-richtig</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 20:00:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/118291.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Aug 2005 06:57:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to fstream: Blockweises Einlesen mit read so richtig? on Wed, 17 Aug 2005 06:57:34 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich wollte mal fragen ob dieser Code korrekt ist:</p>
<pre><code class="language-cpp">std::ifstream file(&quot;C:\\test.dat&quot;, std::ios::binary);

char buffer[256];

do
{
	file.read(buffer, sizeof(buffer));

	if(file.fail())
	{
		// Exception werfen (?)
	}

	// buffer bearbeiten
} while(!file.eof());
</code></pre>
<p>Also vor allen Dingen das mit eof und fail. HumeSikkins beschreibt in seiner FAQ was man beachten muss: <a href="http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&amp;faq=eof#Answ" rel="nofollow">http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&amp;faq=eof#Answ</a></p>
<p>Aber leider ist dort kein Beispiel wie man es richtig macht. (oder ich habs übersehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/853854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/853854</guid><dc:creator><![CDATA[denker]]></dc:creator><pubDate>Wed, 17 Aug 2005 06:57:34 GMT</pubDate></item><item><title><![CDATA[Reply to fstream: Blockweises Einlesen mit read so richtig? on Wed, 17 Aug 2005 07:31:33 GMT]]></title><description><![CDATA[<p>Also die Abfrage auf fail() scheint schonmal falsch zu sein.</p>
<p>Ich hab da mal ne Ausgabe rein gemacht und wenn alles eingelesen ist, gibt fail() true zurück.</p>
<p>Muss die Abfrage vielleicht so lauten?</p>
<pre><code class="language-cpp">if(file.fail() &amp;&amp; !file.eof())
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/853882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/853882</guid><dc:creator><![CDATA[denker]]></dc:creator><pubDate>Wed, 17 Aug 2005 07:31:33 GMT</pubDate></item><item><title><![CDATA[Reply to fstream: Blockweises Einlesen mit read so richtig? on Wed, 17 Aug 2005 10:26:23 GMT]]></title><description><![CDATA[<p>Was ist eigentlich so schlimm daran wenn man while(!file.eof()) benutzt?</p>
<p>Überall steht das das falsch ist, aber dabei wird doch nur einmal die Schleife zu oft ausgeführt, aber dann liest read halt 0 Zeichen. Das ist doch kein Problem oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/854058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854058</guid><dc:creator><![CDATA[denker]]></dc:creator><pubDate>Wed, 17 Aug 2005 10:26:23 GMT</pubDate></item><item><title><![CDATA[Reply to fstream: Blockweises Einlesen mit read so richtig? on Sat, 20 Aug 2005 21:53:14 GMT]]></title><description><![CDATA[<p>Was haltet ihr von dieser Schleife? Ist das so in Ordnung? (funktionieren tuts)</p>
<pre><code class="language-cpp">while(file.read(buffer, bufferSize).gcount() &gt; 0)
{
	//
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/855141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/855141</guid><dc:creator><![CDATA[denker]]></dc:creator><pubDate>Sat, 20 Aug 2005 21:53:14 GMT</pubDate></item><item><title><![CDATA[Reply to fstream: Blockweises Einlesen mit read so richtig? on Thu, 25 Aug 2005 08:58:18 GMT]]></title><description><![CDATA[<p>Weiß das niemand wie man es &quot;richtig&quot; macht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/858065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/858065</guid><dc:creator><![CDATA[denker]]></dc:creator><pubDate>Thu, 25 Aug 2005 08:58:18 GMT</pubDate></item><item><title><![CDATA[Reply to fstream: Blockweises Einlesen mit read so richtig? on Thu, 25 Aug 2005 09:09:18 GMT]]></title><description><![CDATA[<p>denker schrieb:</p>
<blockquote>
<p>Was ist eigentlich so schlimm daran wenn man while(!file.eof()) benutzt?</p>
<p>Überall steht das das falsch ist, aber dabei wird doch nur einmal die Schleife zu oft ausgeführt, aber dann liest read halt 0 Zeichen. Das ist doch kein Problem oder?</p>
</blockquote>
<p>Ob das ein Problem ist oder nicht hängt davon ab, wie deine Verarbeitung der (nicht)-gelesenen Zeichen aussieht. Prinzipiell ist das Ganze erstmal nur ein Logikfehler. Ob daraus dann ein schwerwiegendes Problem wird hängt von der konkreten Situation ab. Auf der anderen Seite: Mach es doch einfach richtig. Das ist nämlich gar nicht schwieriger und du ersparst dir spätere Probleme.</p>
<p>denker schrieb:</p>
<blockquote>
<p>Was haltet ihr von dieser Schleife? Ist das so in Ordnung? (funktionieren tuts)</p>
<pre><code class="language-cpp">while(file.read(buffer, bufferSize).gcount() &gt; 0)
{
	//
}
</code></pre>
</blockquote>
<p>Das ist eine Möglichkeit. Ich wäre wohl etwas expliziter:</p>
<pre><code class="language-cpp">while(file.read(buffer, bufferSize) &amp;&amp; file.gcount() &gt; 0)
{
	//
}
</code></pre>
<p>bzw:</p>
<pre><code class="language-cpp">while(file.read(buffer, bufferSize))
{
    process(buffer, file.gcount());
}
</code></pre>
<blockquote>
<p>Weiß das niemand wie man es &quot;richtig&quot; macht?</p>
</blockquote>
<p>&quot;Richtig&quot; ist abhängig von dem was du erreichen willst. Zumindest ist deine Schleife schon mal nicht falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/858072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/858072</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Thu, 25 Aug 2005 09:09:18 GMT</pubDate></item><item><title><![CDATA[Reply to fstream: Blockweises Einlesen mit read so richtig? on Thu, 25 Aug 2005 09:33:45 GMT]]></title><description><![CDATA[<p>Juhu danke. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Also ich hatte das erst so verstanden das es immer zu Problemen wenn man while(!file.eof()) benutzt. Das ich aber keine Probleme damit bekommen hatte lag wohl daran das ich die Schleife verlassen hab wenn 0 Bytes gelesen wurden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Dann werde ich wohl die zweite Möglichkeit benutzen. Die ist besser lesbar obwohl die erste irgendwie elegant aussieht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Ich wusste gar nicht das ich die beiden Sachen mit &amp;&amp; verknüpfen kann, aber jetzt sehe ich file.read(buffer, bufferSize) wird wohl zu file.good().</p>
<p>Deine dritte Möglichkeit hatte ich auch schon ausprobiert aber die ist glaube ich falsch. Dort wird das letzte Stück nicht eingelesen wenn die Dateigröße nicht genau ein Vielfaches der Puffergröße ist. Oder liegt der Fehler bei mir?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/858085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/858085</guid><dc:creator><![CDATA[denker]]></dc:creator><pubDate>Thu, 25 Aug 2005 09:33:45 GMT</pubDate></item><item><title><![CDATA[Reply to fstream: Blockweises Einlesen mit read so richtig? on Thu, 25 Aug 2005 09:38:53 GMT]]></title><description><![CDATA[<p>Ach das Zweite hat genau das selbe Problem wie das Dritte. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/858088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/858088</guid><dc:creator><![CDATA[denker]]></dc:creator><pubDate>Thu, 25 Aug 2005 09:38:53 GMT</pubDate></item><item><title><![CDATA[Reply to fstream: Blockweises Einlesen mit read so richtig? on Thu, 25 Aug 2005 09:42:38 GMT]]></title><description><![CDATA[<p>Das Problem ist das wenn nicht mehr &lt;Puffergröße&gt; Zeichen vorhanden sind wird das fail bit gesetzt und die Schleife bricht ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/858090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/858090</guid><dc:creator><![CDATA[denker]]></dc:creator><pubDate>Thu, 25 Aug 2005 09:42:38 GMT</pubDate></item><item><title><![CDATA[Reply to fstream: Blockweises Einlesen mit read so richtig? on Thu, 25 Aug 2005 12:33:57 GMT]]></title><description><![CDATA[<p>geht auch ein</p>
<pre><code class="language-cpp">while(file.good())
{
    //...
};
if(!file.eof())
    //Fehler
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/858267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/858267</guid><dc:creator><![CDATA[ness]]></dc:creator><pubDate>Thu, 25 Aug 2005 12:33:57 GMT</pubDate></item><item><title><![CDATA[Reply to fstream: Blockweises Einlesen mit read so richtig? on Sat, 27 Aug 2005 08:54:08 GMT]]></title><description><![CDATA[<p>HumeSikkins kannst du nochmal einen Kommentar dazu abgeben? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Also ist dein Code falsch oder liegt der Fehler bei mir?</p>
<p>Wenn ich bei Variante #2 und #3 nach der Schleife nochmal ein read und process mache dann ist alles in Ordnung, aber das ist ja unschön.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6405">@ness</a>: War das an mich? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/859470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/859470</guid><dc:creator><![CDATA[denker]]></dc:creator><pubDate>Sat, 27 Aug 2005 08:54:08 GMT</pubDate></item><item><title><![CDATA[Reply to fstream: Blockweises Einlesen mit read so richtig? on Sat, 27 Aug 2005 09:23:50 GMT]]></title><description><![CDATA[<p>denker schrieb:</p>
<blockquote>
<p>HumeSikkins kannst du nochmal einen Kommentar dazu abgeben? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Also ist dein Code falsch oder liegt der Fehler bei mir?</p>
</blockquote>
<p>Sorry, mein Fehler. Der Code ist falsch. Zumindest für den allgemeinen Fall.<br />
gcount braucht man ja genau deshalb, weil read auch mal weniger als die n geforderten Zeichen lesen kann. Nämlich z.B. genau dann, wenn die Dateigröße kein ganzzahliges Vielfaches von n ist. In diesem Fall werden im letzten Leseschritt nur m (0 &lt; m &lt; n ) Zeichen gelesen. Gleichzeitig wird beim Versuch n Zeichen zu lesen das eof-bit gesetzt, da am Ende keine n Zeichen mehr vorhanden sind (man liest über das Dateiende hinaus). Demzufolge bricht die Schleife ab, obwohl noch m Zeichen gelesen wurden. Die letzten m Zeichen stehen zwar im Puffer, werden aber nicht mehr bearbeitet.<br />
Die Schleife funktioniert nur korrekt für den Sonderfall n == 1. Deshalb ist eine Schleife à la:</p>
<pre><code class="language-cpp">for (char c; in.get(c); ) {
    // mach was mit c
}
</code></pre>
<p>oder:</p>
<pre><code class="language-cpp">for (int i; in &gt;&gt; i; ) {
    // mach was mit i
}
</code></pre>
<p>auch immer korrekt.</p>
<p>Dein Vorschlag mit dem</p>
<pre><code class="language-cpp">while(file.read(buffer, bufferSize).gcount() &gt; 0)
{
    //
}
</code></pre>
<p>ist also durchaus ok. Du solltest nur nach der Schleife noch prüfen, warum gcount 0 lieferte:</p>
<pre><code class="language-cpp">while(file.read(buffer, bufferSize).gcount() &gt; 0)
{
    //
} 
if (file.eof()) {
   // ok. Datei komplett gelesen
}
else {
  // ups. read schlug aus einem anderen Grund fehl.
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/859489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/859489</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sat, 27 Aug 2005 09:23:50 GMT</pubDate></item></channel></rss>