<?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[std::ifstream fehlverhalten - bloedheit oder mingw bug?]]></title><description><![CDATA[<p>guten morgen,</p>
<p>ich habe gerade ein kleines problem mit std::ifstream.<br />
folgender testcode:</p>
<pre><code class="language-cpp">ifstream fin(&quot;test.dat&quot;, ios::in | ios::binary);
	int count = 1;
	while(!fin.eof())
	{
		char c;
		fin.get(c);
		cout &lt;&lt; &quot;read char number &quot; &lt;&lt; count++ &lt;&lt; &quot;: '&quot; &lt;&lt; c &lt;&lt; &quot;'&quot; &lt;&lt; endl;
	}
	fin.close();
</code></pre>
<p>&quot;test.dat&quot; enthaelt genau 5 byte (sagt mir auch windows): &quot;abcde&quot;.<br />
ich habe es auch mit anderen inhalten getestet, und auch ohne ios::binary flag.</p>
<p>mit &quot;abcde&quot; in test.dat gibt es jedenfalls folgenden output:</p>
<pre><code>read char number 1: 'a'
read char number 2: 'b'
read char number 3: 'c'
read char number 4: 'd'
read char number 5: 'e'
read char number 6: 'e'
</code></pre>
<p>egal, was ich probiere, das letzte byte wird immer doppelt gelesen.<br />
wenn ich nach 5 zeichen die verbleibenden bytes berechne (fin.tellg() von der position nach fin.seekg(0, ios::end) subtrahieren), kommt 0 raus - fin.eof() ist allerdings false.</p>
<p>mache ich hier irgendwas falsch, oder ist das ein bug, der nicht meinem code entspringt?<br />
ich habe uebrigens mingw 32-bit und 64-bit probiert (gcc4.4.0 und 4.5.3), alles unter win7 64bit.</p>
<p>es gab in der vergangenheit scheinbar ab und zu probleme mit ifstream bei mingw, aber was ich ergooglen konnte, war alles andere als aktuell.<br />
ich glaube auch eher dass es an mir liegt ...</p>
<p>danke fuer alle hinweise!</p>
<p>mfg<br />
julian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/275530/std-ifstream-fehlverhalten-bloedheit-oder-mingw-bug</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 23:23:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275530.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 16 Oct 2010 11:09:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::ifstream fehlverhalten - bloedheit oder mingw bug? on Sat, 16 Oct 2010 11:09:36 GMT]]></title><description><![CDATA[<p>guten morgen,</p>
<p>ich habe gerade ein kleines problem mit std::ifstream.<br />
folgender testcode:</p>
<pre><code class="language-cpp">ifstream fin(&quot;test.dat&quot;, ios::in | ios::binary);
	int count = 1;
	while(!fin.eof())
	{
		char c;
		fin.get(c);
		cout &lt;&lt; &quot;read char number &quot; &lt;&lt; count++ &lt;&lt; &quot;: '&quot; &lt;&lt; c &lt;&lt; &quot;'&quot; &lt;&lt; endl;
	}
	fin.close();
</code></pre>
<p>&quot;test.dat&quot; enthaelt genau 5 byte (sagt mir auch windows): &quot;abcde&quot;.<br />
ich habe es auch mit anderen inhalten getestet, und auch ohne ios::binary flag.</p>
<p>mit &quot;abcde&quot; in test.dat gibt es jedenfalls folgenden output:</p>
<pre><code>read char number 1: 'a'
read char number 2: 'b'
read char number 3: 'c'
read char number 4: 'd'
read char number 5: 'e'
read char number 6: 'e'
</code></pre>
<p>egal, was ich probiere, das letzte byte wird immer doppelt gelesen.<br />
wenn ich nach 5 zeichen die verbleibenden bytes berechne (fin.tellg() von der position nach fin.seekg(0, ios::end) subtrahieren), kommt 0 raus - fin.eof() ist allerdings false.</p>
<p>mache ich hier irgendwas falsch, oder ist das ein bug, der nicht meinem code entspringt?<br />
ich habe uebrigens mingw 32-bit und 64-bit probiert (gcc4.4.0 und 4.5.3), alles unter win7 64bit.</p>
<p>es gab in der vergangenheit scheinbar ab und zu probleme mit ifstream bei mingw, aber was ich ergooglen konnte, war alles andere als aktuell.<br />
ich glaube auch eher dass es an mir liegt ...</p>
<p>danke fuer alle hinweise!</p>
<p>mfg<br />
julian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966380</guid><dc:creator><![CDATA[Julian__]]></dc:creator><pubDate>Sat, 16 Oct 2010 11:09:36 GMT</pubDate></item><item><title><![CDATA[Reply to std::ifstream fehlverhalten - bloedheit oder mingw bug? on Sat, 16 Oct 2010 11:19:05 GMT]]></title><description><![CDATA[<p>Eigene Blödheit <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>Wenn du auf eof prüfst <strong>bevor</strong> du liest, was passiert dann wohl, wenn du beim Lesen auf eof triffst? Dein Programm macht munter weiter, obwohl nichts gelesen wurde!</p>
<p>Mach es so:</p>
<pre><code class="language-cpp">while(fin.get(c)) // ...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1966382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966382</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 16 Oct 2010 11:19:05 GMT</pubDate></item><item><title><![CDATA[Reply to std::ifstream fehlverhalten - bloedheit oder mingw bug? on Sat, 16 Oct 2010 11:27:45 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Eigene Blödheit <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>Wenn du auf eof prüfst <strong>bevor</strong> du liest, was passiert dann wohl, wenn du beim Lesen auf eof triffst? Dein Programm macht munter weiter, obwohl nichts gelesen wurde!</p>
<p>Mach es so:</p>
<pre><code class="language-cpp">while(fin.get(c)) // ...
</code></pre>
</blockquote>
<p>moment ... kann sein dass es einfach zu frueh fuer mich ist, aber<br />
- eof?<br />
- lesen<br />
- eof?<br />
- lesen<br />
- eof?<br />
.....<br />
so sollte die schleife aussehen.<br />
nach (und auch vor, wie man es auch lesen mag) jedem lesen wird auf eof() geprueft.<br />
solange ich keine 2 zeichen zwischen 2 eof-checks lese, sollte das doch klappen?? ich habe das gefuehl, ich blamiere mich gerade, aber ich verstehs echt nicht ...<br />
(basiert doch alles darauf, dass das byte (char) die kleines einheit ist, die man lesen kann/die vorhanden sein kann?)</p>
<p>mfg<br />
julian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966384</guid><dc:creator><![CDATA[Julian__]]></dc:creator><pubDate>Sat, 16 Oct 2010 11:27:45 GMT</pubDate></item><item><title><![CDATA[Reply to std::ifstream fehlverhalten - bloedheit oder mingw bug? on Sat, 16 Oct 2010 11:43:29 GMT]]></title><description><![CDATA[<p>Du musst zwischen dem Einlesen und der Ausgabe testen, ob das Einlesen überhaupt erfolgreich war. Im Moment läufts so ab:</p>
<pre><code>fin.get(c); -&gt; c = 'a';
cout &lt;&lt; c;
fin.get(c); -&gt; c = 'b'
cout &lt;&lt; c;
fin.get(c); -&gt; c = 'c'
cout &lt;&lt; c;
fin.get(c); -&gt; c = 'd'
cout &lt;&lt; c;
fin.get(c); -&gt; c = 'e'
cout &lt;&lt; c;
fin.get(c); -&gt; fin.eof, daher bleibt c = 'e'
cout &lt;&lt; c;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1966387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966387</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 16 Oct 2010 11:43:29 GMT</pubDate></item><item><title><![CDATA[Reply to std::ifstream fehlverhalten - bloedheit oder mingw bug? on Sat, 16 Oct 2010 11:54:44 GMT]]></title><description><![CDATA[<p>hm, ok ...<br />
d.h. ja dass das eofbit noch nicht gesetzt wird, nachdem das letzte byte gelesen wurde. dann ist das alles klar. finde ich trotzdem komisch ...<br />
aber danke, ich probiers mal mit dem wissen um diese eigenschaft.</p>
<p>mfg<br />
julian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966390</guid><dc:creator><![CDATA[Julian__]]></dc:creator><pubDate>Sat, 16 Oct 2010 11:54:44 GMT</pubDate></item><item><title><![CDATA[Reply to std::ifstream fehlverhalten - bloedheit oder mingw bug? on Sat, 16 Oct 2010 11:58:59 GMT]]></title><description><![CDATA[<p>Julian__ schrieb:</p>
<blockquote>
<p>d.h. ja dass das eofbit noch nicht gesetzt wird, nachdem das letzte byte gelesen wurde.</p>
</blockquote>
<p>Das Problem ist, dass du im allgemeinen Fall nicht sicher sein kannst, welches das &quot;letzte&quot; Byte ist. Wer weiß, ob beim nächsten Leseversuch - wann immer der sein wird - nicht doch noch ein Zeichen hinzugekommen ist. Das Ende eines Streams kann sich im Laufe der Zeit verändern. Selbst bei Dateien ist das möglich, z.B. wenn gleichzeitig zu deinem Lesezugriff jemand in die Datei schreibt. Darum kann eof immer erst dann gesetzt werden, wenn das Lesen fehlgeschlagen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966392</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Sat, 16 Oct 2010 11:58:59 GMT</pubDate></item><item><title><![CDATA[Reply to std::ifstream fehlverhalten - bloedheit oder mingw bug? on Sat, 16 Oct 2010 12:06:44 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Eigene Blödheit <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>Wenn du auf eof prüfst <strong>bevor</strong> du liest, was passiert dann wohl, wenn du beim Lesen auf eof triffst?</p>
</blockquote>
<p>Eigentlich ist das doch eine dämliche Implementierung vom stream. Wenn ich das letzte richtige Zeichen ('e') einlesen, steht der Lesezeiger auf EOF. Ich brauch doch nicht ein virtuelles EOF einlesen, damit mir der stream EOF sagt. Es gibt garkein EOF in der Datei, sondern nur 5 Zeichen.</p>
<p>MFK schrieb:</p>
<blockquote>
<p>Das Problem ist, dass du im allgemeinen Fall nicht sicher sein kannst, welches das &quot;letzte&quot; Byte ist. Wer weiß, ob beim nächsten Leseversuch - wann immer der sein wird - nicht doch noch ein Zeichen hinzugekommen ist. Das Ende eines Streams kann sich im Laufe der Zeit verändern. Selbst bei Dateien ist das möglich, z.B. wenn gleichzeitig zu deinem Lesezugriff jemand in die Datei schreibt. Darum kann eof immer erst dann gesetzt werden, wenn das Lesen fehlgeschlagen ist.</p>
</blockquote>
<p>Das Problem ist, dass beim stream eof gesetzt wird und nicht einfach bei ausführen von eof() geprüft wird, ob der Lesezeiger auf EOF zeigt. Nach deiner Logik wäre eof auch falsch, wenn irgendwer nach dem &quot;lesen von EOF&quot; noch was in die Datei schreibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966394</guid><dc:creator><![CDATA[elfN]]></dc:creator><pubDate>Sat, 16 Oct 2010 12:06:44 GMT</pubDate></item><item><title><![CDATA[Reply to std::ifstream fehlverhalten - bloedheit oder mingw bug? on Sat, 16 Oct 2010 12:14:00 GMT]]></title><description><![CDATA[<p>naja ... kann man sicher lange drueber diskutieren. ihr habt jedenfalls alle recht, danke fuers augenoeffnen.</p>
<p>mfg<br />
julian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966395</guid><dc:creator><![CDATA[Julian__]]></dc:creator><pubDate>Sat, 16 Oct 2010 12:14:00 GMT</pubDate></item></channel></rss>