<?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[[solved] istream_iterator - letzte Eingabe wird geschluckt]]></title><description><![CDATA[<p>Krug zum Gruße,</p>
<p>ich lese gerade den C++ Primer und bin gerade bei den iostream-iteratoren angelangt.</p>
<p>Mithilfe eines kleinen Programms wollte ich mir die Funktionsweise ein wenig verdeutlichen.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cstdlib&gt;
#include &lt;iterator&gt;

int main (int argc, char ** argv) {

	std::istream_iterator&lt;std::string&gt; iIterator(std::cin), eofIterator;
	std::ostream_iterator&lt;std::string&gt; oIterator(std::cout,&quot;\n&quot;);

	while (iIterator!=eofIterator &amp;&amp; *iIterator!=&quot;exit&quot;)
		*oIterator++ = *iIterator++;
	return EXIT_SUCCESS;
}
</code></pre>
<p>Gebe ich hier beispielsweise folgendes ein: &quot;Ich teste mal ein wenig.&quot;, so wird allerdings der letzte string &quot;wenig.&quot; nicht ausgegeben. Erst nach erneuter Eingabe erfolgt dann die Ausgabe.</p>
<p>Mir ist allerdings nicht ganz klar, warum das so ist. Hätte da jemand eine kurze Erläuterung parat?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274828/solved-istream_iterator-letzte-eingabe-wird-geschluckt</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 07:14:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274828.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 04 Oct 2010 02:40:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [solved] istream_iterator - letzte Eingabe wird geschluckt on Mon, 04 Oct 2010 12:58:36 GMT]]></title><description><![CDATA[<p>Krug zum Gruße,</p>
<p>ich lese gerade den C++ Primer und bin gerade bei den iostream-iteratoren angelangt.</p>
<p>Mithilfe eines kleinen Programms wollte ich mir die Funktionsweise ein wenig verdeutlichen.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cstdlib&gt;
#include &lt;iterator&gt;

int main (int argc, char ** argv) {

	std::istream_iterator&lt;std::string&gt; iIterator(std::cin), eofIterator;
	std::ostream_iterator&lt;std::string&gt; oIterator(std::cout,&quot;\n&quot;);

	while (iIterator!=eofIterator &amp;&amp; *iIterator!=&quot;exit&quot;)
		*oIterator++ = *iIterator++;
	return EXIT_SUCCESS;
}
</code></pre>
<p>Gebe ich hier beispielsweise folgendes ein: &quot;Ich teste mal ein wenig.&quot;, so wird allerdings der letzte string &quot;wenig.&quot; nicht ausgegeben. Erst nach erneuter Eingabe erfolgt dann die Ausgabe.</p>
<p>Mir ist allerdings nicht ganz klar, warum das so ist. Hätte da jemand eine kurze Erläuterung parat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1960962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1960962</guid><dc:creator><![CDATA[inter2k3]]></dc:creator><pubDate>Mon, 04 Oct 2010 12:58:36 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] istream_iterator - letzte Eingabe wird geschluckt on Mon, 04 Oct 2010 04:46:31 GMT]]></title><description><![CDATA[<p>edit (mit dem debugger vll doch nicht all zu einfach nachzuvollziehen, warum er aus dem fkt-aufruf nicht wieder zurückkehrt):<br />
<code>istream_iterator::operator++()</code><br />
liest - wenn er &quot;am ende&quot; des streams angekommen ist, einen neuen wert ein - wartet also auf deine nächste eingabe.<br />
<code>istream_iterator::operator++(int)</code> (den du ja aufrufst) ist üblicherweise so implementiert:</p>
<pre><code class="language-cpp">class_x class_x::operator++(int)
{
  class_x ret_val = *this; //kopie machen
  ++*this; //aufruf des operator++()
  return ret_val;
}
</code></pre>
<p>class_x ist in deinem fall nat. istream_iterator.</p>
<p>die richtige lösung wäre also:</p>
<pre><code class="language-cpp">for(; iIterator != eofIterator &amp;&amp; *iIterator != &quot;exit&quot;; ++iIterator)
{
  *oIterator++ = *iIterator;
}
</code></pre>
<p>wenn wir schon mal dabei sind, könnte man</p>
<pre><code class="language-cpp">std::istream_iterator&lt;std::string&gt; iIterator(std::cin), eofIterator;
</code></pre>
<p>auch in den kopf der for-schleife schreiben - ich würds zumindest so in der Richtung machen:</p>
<pre><code class="language-cpp">typedef std::istream_iterator&lt;std::string&gt; i_iterator_t;
typedef std::ostream_iterator&lt;std::string&gt; o_iterator_t;
o_iterator_t o_iterator(std::cout, &quot;\r\n&quot;);

int main()
{
  for(i_iterator_t i(std::cin), eof; i != eof; ++i)
  {
    if(*i == &quot;exit&quot;)
      break;
    *o_iterator++ = *i;
  }
}
</code></pre>
<p>aber da gibts sicherlich auch andere meinungen.</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1960967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1960967</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 04 Oct 2010 04:46:31 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] istream_iterator - letzte Eingabe wird geschluckt on Mon, 04 Oct 2010 13:02:46 GMT]]></title><description><![CDATA[<p>Herzlichen Dank für die Erläuterung.<br />
Daran, dass beim post-increment ein weiterer Wert eingelesen wird habe ich garnicht gedacht.</p>
<p>Nun habe ich es entsprechend deinen Vorschlägen geändert (wird im Kopf eine for-Schleife inkrementiert) und es funktioniert einwandfrei.</p>
<p>Nochmals herzlichen Dank für den Hinweis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1961151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1961151</guid><dc:creator><![CDATA[inter2k3]]></dc:creator><pubDate>Mon, 04 Oct 2010 13:02:46 GMT</pubDate></item></channel></rss>