<?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_iterator&amp;lt;std::basic_string&amp;lt;T&amp;gt; &amp;gt; - Stoppzeichen definieren]]></title><description><![CDATA[<p>Hi,<br />
ich möchte eine Textdatei Zeilenweise mittels 'ifstream_iterator' auslesen, also habe ich mir eine Methode geschrieben, die in etwa so ausschaut:</p>
<pre><code class="language-cpp">template&lt;typename char_type&gt;
const std::basic_string&lt;char_type&gt; basic_textfile&lt;char_type&gt;::read(unsigned int line)
{
    // 'stream_' ist ein gültiges 'std::basic_fstream&lt;char_type'-Objekt
    std::istream_iterator&lt;std::basic_string&lt;char_type&gt; &gt; iter(stream_), eos;

    for(unsigned int i=0; (++i&lt;line) &amp;&amp; (iter!=eos); ++iter);

    return *iter;
}
</code></pre>
<p>Kompiliert und arbeitet einwandfrei, bis auf den Umstand, dass scheinbar die Zeilen nicht immer bis zum Ende gelesen werden, sondern schon beim Auftreten von Leerzeichen abgebrochen wird.</p>
<p>Beispiel für eine Textdatei:</p>
<blockquote>
<p>muh<br />
miau<br />
wau wau<br />
grunz</p>
</blockquote>
<p>Versuch' ich nun mittels o.g. Funktion die 3. Zeile zu lesen, bekomme ich natürlich nicht &quot;wau wau&quot; geliefert wie gewollt, sondern nur &quot;wau&quot;. Meine Frage: Wie erreiche ich, dass dieses Leerzeichen im Strom ignoriert, bzw. vom Iterator übergangen wird? Geht das irgendwie auch ohne eine neue Iterator- oder Stringklasse abzuleiten?</p>
<p>Google hilft leider kaum, da das Problem ja doch schon sehr speziell ist. Achja, mir ist natürlich bewusst, dass man diese Problemstellung auch anders bewältigen könnte, beispielsweise mittels 'getline' oder 'read', hab' ich auch schon 1000x gemacht, aber ich finde diese Variante am schönsten und bin auf jeden Fall an einer Lösung interessiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/151487/std-ifstream_iterator-lt-std-basic_string-lt-t-gt-gt-stoppzeichen-definieren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 12:09:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/151487.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 26 Jun 2006 18:35:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::ifstream_iterator&amp;lt;std::basic_string&amp;lt;T&amp;gt; &amp;gt; - Stoppzeichen definieren on Mon, 26 Jun 2006 18:35:58 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich möchte eine Textdatei Zeilenweise mittels 'ifstream_iterator' auslesen, also habe ich mir eine Methode geschrieben, die in etwa so ausschaut:</p>
<pre><code class="language-cpp">template&lt;typename char_type&gt;
const std::basic_string&lt;char_type&gt; basic_textfile&lt;char_type&gt;::read(unsigned int line)
{
    // 'stream_' ist ein gültiges 'std::basic_fstream&lt;char_type'-Objekt
    std::istream_iterator&lt;std::basic_string&lt;char_type&gt; &gt; iter(stream_), eos;

    for(unsigned int i=0; (++i&lt;line) &amp;&amp; (iter!=eos); ++iter);

    return *iter;
}
</code></pre>
<p>Kompiliert und arbeitet einwandfrei, bis auf den Umstand, dass scheinbar die Zeilen nicht immer bis zum Ende gelesen werden, sondern schon beim Auftreten von Leerzeichen abgebrochen wird.</p>
<p>Beispiel für eine Textdatei:</p>
<blockquote>
<p>muh<br />
miau<br />
wau wau<br />
grunz</p>
</blockquote>
<p>Versuch' ich nun mittels o.g. Funktion die 3. Zeile zu lesen, bekomme ich natürlich nicht &quot;wau wau&quot; geliefert wie gewollt, sondern nur &quot;wau&quot;. Meine Frage: Wie erreiche ich, dass dieses Leerzeichen im Strom ignoriert, bzw. vom Iterator übergangen wird? Geht das irgendwie auch ohne eine neue Iterator- oder Stringklasse abzuleiten?</p>
<p>Google hilft leider kaum, da das Problem ja doch schon sehr speziell ist. Achja, mir ist natürlich bewusst, dass man diese Problemstellung auch anders bewältigen könnte, beispielsweise mittels 'getline' oder 'read', hab' ich auch schon 1000x gemacht, aber ich finde diese Variante am schönsten und bin auf jeden Fall an einer Lösung interessiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1086287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1086287</guid><dc:creator><![CDATA[GreveN]]></dc:creator><pubDate>Mon, 26 Jun 2006 18:35:58 GMT</pubDate></item><item><title><![CDATA[Reply to std::ifstream_iterator&amp;lt;std::basic_string&amp;lt;T&amp;gt; &amp;gt; - Stoppzeichen definieren on Tue, 27 Jun 2006 08:10:13 GMT]]></title><description><![CDATA[<blockquote>
<p>Geht das irgendwie auch ohne eine neue Iterator- oder Stringklasse abzuleiten?</p>
</blockquote>
<p>Ich fürchte, das geht nicht - der istream_iterator verwendet op&gt;&gt; zum Einlesen und der stoppt beim ersten Whitespace. Du könntest höchstens ein neues Locale definieren, das nur das \n als Whitespace anerkennt (braucht einige Anpassungen in der Facette &quot;ctype&quot;) - oder du definierst dir einen eigenen line_iterator auf Basis von getline().</p>
<p>(letzteres ist wohl einfacher umzusetzen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1086599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1086599</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 27 Jun 2006 08:10:13 GMT</pubDate></item><item><title><![CDATA[Reply to std::ifstream_iterator&amp;lt;std::basic_string&amp;lt;T&amp;gt; &amp;gt; - Stoppzeichen definieren on Tue, 27 Jun 2006 08:56:21 GMT]]></title><description><![CDATA[<p>Hm, das ist schade, jedenfalls danke für deine Hilfe, ich werd's wohl so machen denk ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1086640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1086640</guid><dc:creator><![CDATA[GreveN]]></dc:creator><pubDate>Tue, 27 Jun 2006 08:56:21 GMT</pubDate></item><item><title><![CDATA[Reply to std::ifstream_iterator&amp;lt;std::basic_string&amp;lt;T&amp;gt; &amp;gt; - Stoppzeichen definieren on Tue, 27 Jun 2006 10:30:28 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;iterator&gt;
#include &lt;string&gt;

using namespace std;

int main()
{
  ifstream fs(&quot;datei&quot;);
  fs.unsetf(ios_base::skipws);  // !!!
  istream_iterator&lt;char&gt; ii(fs), eos;

  while (ii != eos) cout &lt;&lt; *ii++;

  return EXIT_SUCCESS;
}
</code></pre>
<p>out schrieb:</p>
<blockquote>
<p>muh<br />
miau<br />
wau wau<br />
grunz</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1086694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1086694</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 27 Jun 2006 10:30:28 GMT</pubDate></item><item><title><![CDATA[Reply to std::ifstream_iterator&amp;lt;std::basic_string&amp;lt;T&amp;gt; &amp;gt; - Stoppzeichen definieren on Tue, 27 Jun 2006 13:06:04 GMT]]></title><description><![CDATA[<p>Sowas hatte ich gesucht. <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="🙂"
    /> Ich war so fixiert darauf, die Lösung beim Iterator zu suchen, dass ich an die Format-Flags gar nicht mehr gedacht hatte. Leider funktioniert das so auch noch nicht ganz, da durch das Deaktiveren des 'skipws'-Flags leider auch die &quot;line feed&quot;-Zeichen etc. ignoriert werden und ein zeilenweises Lesen in 'std::basic_string&lt;T&gt;' nicht mehr möglich ist, oder ich stelle mich nur zu dumm an.</p>
<p>Ein Gedanke den ich noch hatte: Eventuell einen Algorithmus definieren (eventuell 'copy_if') und dann Zeichen für Zeichen in den String kopieren, bis auf ein &quot;line feed&quot;-Zeichen gestoßen wird. Allerdings müsste ich dazu wiederum einen Algorithmus schreiben (mir ist zumindest keiner im Standard bekannt, der das Gewünschte leistet) und einen Functor für die Bedingung. Eine Konstruktion mit 'copy' und 'find' würde vielleicht auch funktionieren.</p>
<p>Am Schönsten wäre es natürlich, wenn es so einfach funktionieren würde à la &quot;whitespaces&quot; ignorieren aber &quot;feed line&quot; mitnehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1086846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1086846</guid><dc:creator><![CDATA[GreveN]]></dc:creator><pubDate>Tue, 27 Jun 2006 13:06:04 GMT</pubDate></item><item><title><![CDATA[Reply to std::ifstream_iterator&amp;lt;std::basic_string&amp;lt;T&amp;gt; &amp;gt; - Stoppzeichen definieren on Tue, 27 Jun 2006 13:12:13 GMT]]></title><description><![CDATA[<p>GreveN schrieb:</p>
<blockquote>
<p>Allerdings müsste ich dazu wiederum einen Algorithmus schreiben (mir ist zumindest keiner im Standard bekannt, der das Gewünschte leistet) und einen Functor für die Bedingung.</p>
</blockquote>
<p>remove_copy_if mit invertiertem prädikat:</p>
<pre><code class="language-cpp">template&lt;typename InputIterator, typename OutputIterator, typename Predicate&gt;
OutputIterator copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred)
{
    return std::remove_copy_if( first, last, result, std::not2( pred ) );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1086854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1086854</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 27 Jun 2006 13:12:13 GMT</pubDate></item><item><title><![CDATA[Reply to std::ifstream_iterator&amp;lt;std::basic_string&amp;lt;T&amp;gt; &amp;gt; - Stoppzeichen definieren on Tue, 27 Jun 2006 13:20:51 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>remove_copy_if mit invertiertem prädikat</p>
</blockquote>
<p><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>
]]></description><link>https://www.c-plusplus.net/forum/post/1086864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1086864</guid><dc:creator><![CDATA[ssm]]></dc:creator><pubDate>Tue, 27 Jun 2006 13:20:51 GMT</pubDate></item></channel></rss>