<?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[Schleife mit .good() iteriert zu oft]]></title><description><![CDATA[<p>Hi, wenn ich ein Textfile mit folgenden Inhalt habe:</p>
<p>1<br />
2<br />
3</p>
<p>, wobei nach dem dreier nichts mehr kommt (keine whitespaces, insbesondere kein new line)</p>
<p>und ich den Inhalt einlese mit:</p>
<pre><code>ifstream ifs(&quot;filename.txt&quot;);
while(ifs.good()) {
		getline(ifs, line);

		cout &lt;&lt; line &lt;&lt; endl;
	}
</code></pre>
<p>, dann iteriert er einmal zu oft drüber (also 4 mal). wodruch noch eine leerzeile am schluss ausgegeben wird.<br />
.good() müsste doch eigentlich das eofbit checken und wenn es gesetzt ist, dann müsste False zurückgegeben werden, wodurch die Schleife eigentlich nur drei mal durchlaufen werden müsste.</p>
<p>Weiß jemand Rat?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/275559/schleife-mit-good-iteriert-zu-oft</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 17:12:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275559.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 16 Oct 2010 20:07:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Schleife mit .good() iteriert zu oft on Sat, 16 Oct 2010 20:07:40 GMT]]></title><description><![CDATA[<p>Hi, wenn ich ein Textfile mit folgenden Inhalt habe:</p>
<p>1<br />
2<br />
3</p>
<p>, wobei nach dem dreier nichts mehr kommt (keine whitespaces, insbesondere kein new line)</p>
<p>und ich den Inhalt einlese mit:</p>
<pre><code>ifstream ifs(&quot;filename.txt&quot;);
while(ifs.good()) {
		getline(ifs, line);

		cout &lt;&lt; line &lt;&lt; endl;
	}
</code></pre>
<p>, dann iteriert er einmal zu oft drüber (also 4 mal). wodruch noch eine leerzeile am schluss ausgegeben wird.<br />
.good() müsste doch eigentlich das eofbit checken und wenn es gesetzt ist, dann müsste False zurückgegeben werden, wodurch die Schleife eigentlich nur drei mal durchlaufen werden müsste.</p>
<p>Weiß jemand Rat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966547</guid><dc:creator><![CDATA[Cloudwalker]]></dc:creator><pubDate>Sat, 16 Oct 2010 20:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to Schleife mit .good() iteriert zu oft on Sat, 16 Oct 2010 20:10:12 GMT]]></title><description><![CDATA[<p>Hatten wir heute schon mal: <a href="http://c-plusplus.net/forum/viewtopic-var-t-is-275530.html" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-t-is-275530.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966549</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 16 Oct 2010 20:10:12 GMT</pubDate></item><item><title><![CDATA[Reply to Schleife mit .good() iteriert zu oft on Sat, 16 Oct 2010 20:24:04 GMT]]></title><description><![CDATA[<p>cool danke, es funktioniert tatsächlich mit</p>
<pre><code>while(getline(ifs, line)) {        
        cout &lt;&lt; line &lt;&lt; endl;
    }
</code></pre>
<p>Es müsste dann irgendwie so sein, dass die getline Methode beim Einlesen von &quot;3&quot; noch nicht checkt, dass dies die letzte Zeile ist und das eof-bit noch nicht setzt, sondern erst beim nächsten leseversuch merkt, dass es nichts mehr zum lesen gibt denke ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966553</guid><dc:creator><![CDATA[Cloudwalker]]></dc:creator><pubDate>Sat, 16 Oct 2010 20:24:04 GMT</pubDate></item><item><title><![CDATA[Reply to Schleife mit .good() iteriert zu oft on Sat, 16 Oct 2010 21:36:52 GMT]]></title><description><![CDATA[<p>Cloudwalker schrieb:</p>
<blockquote>
<p>Es müsste dann irgendwie so sein, dass die getline Methode beim Einlesen von &quot;3&quot; noch nicht checkt, dass dies die letzte Zeile ist und das eof-bit noch nicht setzt, sondern erst beim nächsten leseversuch merkt, dass es nichts mehr zum lesen gibt denke ich.</p>
</blockquote>
<p>Wie schon gesagt, bei einem Stream weiß man in der Regel vorher nicht, wann er zu Ende ist.<br />
Wenn ein Stream immer dann als &quot;beendet&quot; angesehen würde, wenn gerade keine Daten mehr zu lesen da sind, könnten wir uns jetzt nicht über's Internet unterhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966569</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sat, 16 Oct 2010 21:36:52 GMT</pubDate></item><item><title><![CDATA[Reply to Schleife mit .good() iteriert zu oft on Sun, 17 Oct 2010 05:20:44 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>Wie schon gesagt, bei einem Stream weiß man in der Regel vorher nicht, wann er zu Ende ist.<br />
Wenn ein Stream immer dann als &quot;beendet&quot; angesehen würde, wenn gerade keine Daten mehr zu lesen da sind, könnten wir uns jetzt nicht über's Internet unterhalten.</p>
</blockquote>
<p>Wie schon gesagt, wie das Quatsch. Mit einem while( getline.. ) könnten wir uns jetzt auch nicht über's Internet unterhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966596</guid><dc:creator><![CDATA[elfN]]></dc:creator><pubDate>Sun, 17 Oct 2010 05:20:44 GMT</pubDate></item><item><title><![CDATA[Reply to Schleife mit .good() iteriert zu oft on Sun, 17 Oct 2010 06:09:21 GMT]]></title><description><![CDATA[<p>elfN schrieb:</p>
<blockquote>
<p>Wie schon gesagt, wie das Quatsch. Mit einem while( getline.. ) könnten wir uns jetzt auch nicht über's Internet unterhalten.</p>
</blockquote>
<p>Ich glaube, du hast das immer noch nicht verstanden. Argumentierst du immer noch mit diesem &quot;Lesezeiger&quot;? Ist dir klar, dass es so etwas im allgemeinen Fall gar nicht gibt? Streams gibt's nicht nur für Dateien.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966600</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Sun, 17 Oct 2010 06:09:21 GMT</pubDate></item><item><title><![CDATA[Reply to Schleife mit .good() iteriert zu oft on Sun, 17 Oct 2010 06:38:57 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>elfN schrieb:</p>
<blockquote>
<p>Wie schon gesagt, wie das Quatsch. Mit einem while( getline.. ) könnten wir uns jetzt auch nicht über's Internet unterhalten.</p>
</blockquote>
<p>Ich glaube, du hast das immer noch nicht verstanden. Argumentierst du immer noch mit diesem &quot;Lesezeiger&quot;? Ist dir klar, dass es so etwas im allgemeinen Fall gar nicht gibt? Streams gibt's nicht nur für Dateien.</p>
</blockquote>
<p>Das ist völlig egal. Du kannst ein Flag &quot;EOF&quot; auf true setzen, wenn du versuchst was zu lesen und am Ende bist oder eine Funktion schreiben, die prüft, ob es was zu lesen gibt und true oder false liefert. Da ist es egal, was das für ein stream ist. Immer wenn du das Flag beim Lesen setzen kannst, kannst du auch direkt abfragen ob das Flag jetzt gesetzt würde, wenn du lesen würdest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966604</guid><dc:creator><![CDATA[elfN]]></dc:creator><pubDate>Sun, 17 Oct 2010 06:38:57 GMT</pubDate></item><item><title><![CDATA[Reply to Schleife mit .good() iteriert zu oft on Sun, 17 Oct 2010 07:26:16 GMT]]></title><description><![CDATA[<p>elfN schrieb:</p>
<blockquote>
<p>Immer wenn du das Flag beim Lesen setzen kannst, kannst du auch direkt abfragen ob das Flag jetzt gesetzt würde, wenn du lesen würdest.</p>
</blockquote>
<p>Darum geht's doch gar nicht.</p>
<p>Es geht darum, ob dieses Flag nach dem letzten erfolgreichen Lesevorgang gesetzt werden soll, oder nach dem ersten fehlgeschlagenen.</p>
<p>Wenn ich dich richtig verstanden habe, scheinst du Ersteres zu befürworten. Die C++-Streams tun aber Letzteres.</p>
<p>Der Grund dafür ist, dass du einem erfolgreichen Lesevorgang gar nicht zweifelsfrei ansehen kannst, ob er der letzte ist. Du weißt ja nicht, wann der nächste Lesevorgang erfolgt, und ob der Stream bis dahin nicht wieder Daten liefern kann. Warum also möglicherweise vorzeitig abbrechen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966612</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Sun, 17 Oct 2010 07:26:16 GMT</pubDate></item><item><title><![CDATA[Reply to Schleife mit .good() iteriert zu oft on Sun, 17 Oct 2010 08:49:58 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>elfN schrieb:</p>
<blockquote>
<p>Immer wenn du das Flag beim Lesen setzen kannst, kannst du auch direkt abfragen ob das Flag jetzt gesetzt würde, wenn du lesen würdest.</p>
</blockquote>
<p>Darum geht's doch gar nicht.</p>
<p>Es geht darum, ob dieses Flag nach dem letzten erfolgreichen Lesevorgang gesetzt werden soll, oder nach dem ersten fehlgeschlagenen.</p>
<p>Wenn ich dich richtig verstanden habe, scheinst du Ersteres zu befürworten.</p>
</blockquote>
<p>Nein. Ich bin für drittens: Gar kein EOF Flag setzen, sondern das machen was du meinst, worum es nicht geht, einfach eine direkte Abfrage.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966619</guid><dc:creator><![CDATA[elfN]]></dc:creator><pubDate>Sun, 17 Oct 2010 08:49:58 GMT</pubDate></item><item><title><![CDATA[Reply to Schleife mit .good() iteriert zu oft on Sun, 17 Oct 2010 10:05:43 GMT]]></title><description><![CDATA[<p>elfN schrieb:</p>
<blockquote>
<p>Ich bin für drittens: Gar kein EOF Flag setzen, sondern das machen was du meinst, worum es nicht geht, einfach eine direkte Abfrage.</p>
</blockquote>
<p>Wie soll das in der Anwendung aussehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966636</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Sun, 17 Oct 2010 10:05:43 GMT</pubDate></item><item><title><![CDATA[Reply to Schleife mit .good() iteriert zu oft on Sun, 17 Oct 2010 11:43:17 GMT]]></title><description><![CDATA[<blockquote>
<p>Gar kein EOF Flag setzen, sondern das machen was du meinst, worum es nicht geht, einfach eine direkte Abfrage.</p>
</blockquote>
<p>Könntest du das bitte nochmal so formulieren, dass man es versteht? Besonders den Teil ab dem zweiten Komma verstehe ich nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966662</guid><dc:creator><![CDATA[??????]]></dc:creator><pubDate>Sun, 17 Oct 2010 11:43:17 GMT</pubDate></item><item><title><![CDATA[Reply to Schleife mit .good() iteriert zu oft on Sun, 17 Oct 2010 13:46:58 GMT]]></title><description><![CDATA[<p>Wenn ich das richtig verstehe, meint er, dass eof() nicht nur ein Flag prüfen soll, sondern nachkucken, ob aus dem Stream noch etwas gelesen werden kann.</p>
<p>MFK hat im Grunde schon genannt, warum das eine alberne Idee ist. Wenn du an einer FIFO hängst, wird es schon schwierig, dafür eine sinnvolle Semantik zu definieren. Hängst du gar an einem benutzerdefinierten Stream, der seine Daten aus einer Berechnung zieht, kann es schnell völlig unmöglich werden.</p>
<p>Es macht aus meiner Sicht keinen Sinn, von einem Eingabestrom zu verlangen, dass er vor einem Leseversuch zu wissen habe, ob dieser funktionieren werde, zumal historisch unter iostreams liegende Betriebssystemsschnittstellen ein solches Verhalten nicht bieten. Man würde sich damit die Nutzung des Konzepts für solche Fälle versperren, in denen das nicht möglich oder nicht sinnvoll ist, ohne einen angemessenen Nutzen aus der Einschränkung zu ziehen.</p>
<p>Ich verstehe auch nicht, was der Aufruhr soll. Der übliche Anwendungsfall ist eh &quot;Lies so lange Daten, wie du kannst&quot; - die gesetzten Flags lassen sich später immer noch prüfen - und wenn man tatsächlich nur auf das eof-Bit prüfen will, schreibt man halt</p>
<pre><code class="language-cpp">while(getline(stream, str).eof()) {
  // ...
}
</code></pre>
<p>...wobei man sich dann natürlich um die Behandlung anderer Fehlerflags in der Schleife selbst kümmern muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966705</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 17 Oct 2010 13:46:58 GMT</pubDate></item></channel></rss>