<?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[Datei zeichenweise auslesen - newline Problem.]]></title><description><![CDATA[<p>Ich möchte gerne eine Datei, Inhalt z.B. &quot; 5, 10, 15&quot; auslesen, dabei taucht das Problem auf, wenn in der Datei am Ende kein newline-Zeichen gesetzt ist, werden die letzten beiden Ziffern nicht mit auf der Konsole ausgegeben.<br />
Man könnte natürlich vor dem Auslesen gegebenenfalls ein newline-Zeichen setzen,<br />
aber das scheint mir nicht im Sinne des Erfinders zu sein.<br />
Leider verstehe ich auch nicht wirklich den Grund dafür. Hatte schon mal gegoogelt, aber nichts wirklich brauchbares gefunden.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

using namespace std;

int main()
{
    ifstream filestream(&quot;test.txt&quot;);
    string s;

    for(char ch;filestream.good();)
    {
        filestream.get(ch);
        if((ch&gt;='0') &amp;&amp; (ch&lt;='9'))
        {
            s+=ch;
        }
         else
        {
           cout&lt;&lt;s&lt;&lt;&quot; &quot;;
           s.clear();
        }

        }

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/299805/datei-zeichenweise-auslesen-newline-problem</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 01:27:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/299805.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Feb 2012 22:07:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sat, 18 Feb 2012 22:07:02 GMT]]></title><description><![CDATA[<p>Ich möchte gerne eine Datei, Inhalt z.B. &quot; 5, 10, 15&quot; auslesen, dabei taucht das Problem auf, wenn in der Datei am Ende kein newline-Zeichen gesetzt ist, werden die letzten beiden Ziffern nicht mit auf der Konsole ausgegeben.<br />
Man könnte natürlich vor dem Auslesen gegebenenfalls ein newline-Zeichen setzen,<br />
aber das scheint mir nicht im Sinne des Erfinders zu sein.<br />
Leider verstehe ich auch nicht wirklich den Grund dafür. Hatte schon mal gegoogelt, aber nichts wirklich brauchbares gefunden.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

using namespace std;

int main()
{
    ifstream filestream(&quot;test.txt&quot;);
    string s;

    for(char ch;filestream.good();)
    {
        filestream.get(ch);
        if((ch&gt;='0') &amp;&amp; (ch&lt;='9'))
        {
            s+=ch;
        }
         else
        {
           cout&lt;&lt;s&lt;&lt;&quot; &quot;;
           s.clear();
        }

        }

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2182808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182808</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Sat, 18 Feb 2012 22:07:02 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sat, 18 Feb 2012 22:51:25 GMT]]></title><description><![CDATA[<p>Du liest, verarbeitest, dann prüfst du (im Schleifenkopf) ob das Lesen erfolgreich war. Überleg mal, was wohl passiert, wenn das Lesen nicht erfolgreich war. Üblicherweise sehen Leseschleifen daher so aus: <code>while(Leseaktion) verarbeitung;</code></p>
<p>Ebenso ist das Problem nach dem du fragst auf einen Logikfehler zu schieben. Wenn du die Ausgabe nur machst, wenn du etwas anderes liest als eine Ziffer, dann brauchst du dich auch nicht wundern, dass du die letzte Ausgabe nicht bekommst, wenn das letzte Zeichen eine Ziffer ist. Formulier deinen Ablauf doch mal ein bisschen anders.</p>
<p>Aber: Was willst du überhaupt erreichen? Im Moment sieht das nach einer unendlich umständlichen Art und Weise aus, (bis auf den Fehler) alle Zahlen aus einer Datei auszugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2182816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182816</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 18 Feb 2012 22:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sun, 19 Feb 2012 20:01:13 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Du liest, verarbeitest, dann prüfst du (im Schleifenkopf) ob das Lesen erfolgreich war. Überleg mal, was wohl passiert, wenn das Lesen nicht erfolgreich war. Üblicherweise sehen Leseschleifen daher so aus:<br />
<code>while(Leseaktion) verarbeitung;</code></p>
</blockquote>
<p>Ok. Verbesserungsvorschlag:</p>
<pre><code class="language-cpp">if(!filestream())
{
cerr&lt;&lt;&quot;Fehler beim Öffnen der Datei.&quot;;
}
else
{
 char ch;
 while(filestream.get(ch))
{
 cout&lt;&lt;ch;  
} 
}
</code></pre>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Ebenso ist das Problem nach dem du fragst auf einen Logikfehler zu schieben. Wenn du die Ausgabe nur machst, wenn du etwas anderes liest als eine Ziffer, dann brauchst du dich auch nicht wundern, dass du die letzte Ausgabe nicht bekommst, wenn das letzte Zeichen eine Ziffer ist. Formulier deinen Ablauf doch mal ein bisschen anders.</p>
</blockquote>
<p>Ja, das stimmt. Mittlerweile habe ich eine Lösung gefunden. Es werden alle Zeichen in ein Array gespeichert. Beim Auslesen des Arrays wird nach dem Übertragen eines Zeichens in den String das nächste Zeichen abgefragt, ist es keine Zahl wird der String ausgegeben und geleert. Usw.<br />
Theoretisch müßte man dies auch innerhalb des Streams machen können, indem man die Leseposition ein Zeichen weitersetzt, abfragt und dann wieder zurückgeht.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

using namespace std;

int main ()

{
 int length;                   
 ifstream filestream(&quot;test.txt&quot;,ios::binary);
 //Länge des Streams ermitteln
 filestream.seekg(0,ios::end);
 length=filestream.tellg();
 filestream.seekg(0,ios::beg);
 //Array mit der Länge des Streams erzeugen und Daten übertragen.
 char buffer[length];
 filestream.read(buffer,length);
 //filestream.close();
 //Analyse des Streams und Ausgabe der Zahlen
 string s;
 for(int i=0;i&lt;length;++i)
 {
     if ((buffer[i])&gt;='0' &amp;&amp; (buffer[i]&lt;='9'))    //Wenn Zahl ja, dann Übertrag in den String.
         {
           s+=buffer[i];
             if ((buffer[i+1])&lt;'0'|| (buffer[i+1])&gt;'9')   //Wenn das nächste Zeichen im Array keine Zahl ist, dann
             {                                            //Ausgabe des Strings mit anschließender Leerung.
                 cout&lt;&lt;s&lt;&lt;&quot; &quot;;
                 s.clear();
                 continue;                               //nächster Schleifendurchlauf.
             }
         }
 }
 return 0;
}
</code></pre>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Aber: Was willst du überhaupt erreichen? Im Moment sieht das nach einer unendlich umständlichen Art und Weise aus, (bis auf den Fehler) alle Zahlen aus einer Datei auszugeben.</p>
</blockquote>
<p>Ja, Ziel ist es, alle Zahlen aus einer Datei auszulesen. Wichtig ist mir dabei, daß zusammenhängende Ziffern als Zahl erkannt werden und jegliche Zwischenraumzeichen ignoriert werden.<br />
Ist Marke Eigenbau und da natürlich noch kein Meister vom Himmel gefallen ist, geht es vermutlich auch einfacher.<br />
Wenn Du weißt, wie es besser geht, schaue ich mir das gerne an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183161</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Sun, 19 Feb 2012 20:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sun, 19 Feb 2012 19:48:53 GMT]]></title><description><![CDATA[<p>Wenn du uns sagst, wie die File genau aussieht, gibt es bestimmt eine viel elegantere Lösung. Enthält sie nur Zahlen, ',' und Leerzeichen?<br />
Im Übrigen würde ich nicht exit(-1) verwenden, da werden lokale Objekte nicht zerstört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183171</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 19 Feb 2012 19:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sun, 19 Feb 2012 20:01:49 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Wenn du uns sagst, wie die File genau aussieht, gibt es bestimmt eine viel elegantere Lösung. Enthält sie nur Zahlen, ',' und Leerzeichen?</p>
</blockquote>
<p>Der Inhalt soll beliebig sein, z.B. auch: &quot;§!56 zp-,7789&quot;.</p>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Im Übrigen würde ich nicht exit(-1) verwenden, da werden lokale Objekte nicht zerstört.</p>
</blockquote>
<p>Ok, hatte das aus einem Lehrbuch (Der C++-Programmierer) übernommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183173</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Sun, 19 Feb 2012 20:01:49 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sun, 19 Feb 2012 20:17:17 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
  int wert;
  while (!(cin &gt;&gt; wert).eof())
    if (cin)
      cout &lt;&lt; wert &lt;&lt; '\n';
    else
      {
        cin.clear();
        cin.ignore(1);
      }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2183178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183178</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 19 Feb 2012 20:17:17 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sun, 19 Feb 2012 20:55:36 GMT]]></title><description><![CDATA[<p>redrew99 schrieb:</p>
<blockquote>
<p>Ok, hatte das aus einem Lehrbuch (Der C++-Programmierer) übernommen.</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="😃"
    /> Lese ich auch gerade. Die Stelle kam bei mir auch vor ein paar Tagen vor und da hatte ich mich schon gefragt, wieso er exit verwendet.</p>
<p>Verstehst du die Lösung von SeppJ oder noch Erklärungsbedarf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183186</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 19 Feb 2012 20:55:36 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sun, 19 Feb 2012 21:05:57 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a><br />
Danke, das ist wirklich superkurz <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>Beim Testen des Programms ist mir etwas aufgefallen:<br />
Ein &quot;-&quot; vor einer Zahl wird nicht als Bindestrich angesehen, sondern als Minuszeichen.<br />
Es wäre nicht schlecht, wenn man das entsprechend einstellen könnte, je nachdem ob es halt negative Zahlen geben soll oder<br />
nicht.</p>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Verstehst du die Lösung von SeppJ oder noch Erklärungsbedarf?</p>
</blockquote>
<p>Was ich nicht verstehe ist, warum zusammenhängende Ziffern als Zahl gewertet werden.<br />
Vermutlich ist die entsprechende Klassenfunktion so programmiert, die würde ich mir gerne mal anschauen, hab bei<br />
<a href="http://www.cplusplus.com/reference/iostream/istream/" rel="nofollow">http://www.cplusplus.com/reference/iostream/istream/</a> leider nichts dazu gefunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183189</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Sun, 19 Feb 2012 21:05:57 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sun, 19 Feb 2012 22:21:26 GMT]]></title><description><![CDATA[<p>Ergänzung:</p>
<p>Wenn man bei dem Programm z.B. &quot;--798&quot; o. &quot;+-298&quot; eingibt, wird &quot;798&quot; bzw. &quot;298&quot; ausgegeben.<br />
Das ist irgendwie unlogisch. Entweder wird ein Bindestrich als Minuszeichen angesehen oder halt nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183214</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Sun, 19 Feb 2012 22:21:26 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sun, 19 Feb 2012 22:36:09 GMT]]></title><description><![CDATA[<p>Nimm eben unsigned int.</p>
<p>Die Klassenfunktion ist diese:<br />
<a href="http://www.cplusplus.com/reference/iostream/istream/operator%3E%3E/" rel="nofollow">http://www.cplusplus.com/reference/iostream/istream/operator&gt;&gt;/</a> (leider scheint die Formatierung auf der Seite nicht in Ordnung zu sein)<br />
Kennst du also sicherlich schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183217</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 19 Feb 2012 22:36:09 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sun, 19 Feb 2012 23:12:42 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Nimm eben unsigned int.</p>
</blockquote>
<p>Hatte ich schon ausprobiert, das geht leider auch nicht.<br />
Bei Eingabe von z.B. &quot;-764&quot; gibt die Konsole &quot;4294966498&quot; aus.</p>
<p>Auch cin.ignore(1,'-') habe ich[Edit: separat] probiert, wobei ich nicht genau weiß, ob das in diesem Kontext überhaupt Sinn macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183218</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Sun, 19 Feb 2012 23:12:42 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sun, 19 Feb 2012 22:55:59 GMT]]></title><description><![CDATA[<p>Ja was denn nun? Willst du Vorzeichen oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183220</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 19 Feb 2012 22:55:59 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sun, 19 Feb 2012 23:11:18 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ja was denn nun? Willst du Vorzeichen oder nicht?</p>
</blockquote>
<p>Das verstehe ich jetzt nicht. Dein Vorschlag war, aus &quot;int&quot; &quot;unsigned int&quot; zu machen. Das funktioniert aber nicht.<br />
Das Programm sollte dann aus z.B. &quot;b-764&quot; 764 machen, tut es aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183223</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Sun, 19 Feb 2012 23:11:18 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Sun, 19 Feb 2012 23:47:02 GMT]]></title><description><![CDATA[<p>Ok, dieses Feature war mir bisher gar nicht so bewusst. Dann eben so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cctype&gt;

using namespace std;

int main()
{
  while (cin)
    if (isdigit(cin.peek()))
      {
        unsigned wert;
        cin &gt;&gt; wert;
        cout &lt;&lt; wert &lt;&lt; '\n';
      }
      else
        cin.ignore(1);
}
</code></pre>
<p>Auch schön kurz und knackig.</p>
<p>P.S.: Oder noch einen Tacken kürzer:</p>
<pre><code class="language-cpp">int main()
{
  do 
    if (isdigit(cin.peek()))
      {
        unsigned wert;
        cin &gt;&gt; wert;
        cout &lt;&lt; wert &lt;&lt; '\n';
      }
  while (cin.ignore(1));
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2183226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183226</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 19 Feb 2012 23:47:02 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Mon, 20 Feb 2012 08:58:13 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ok, dieses Feature war mir bisher gar nicht so bewusst.</p>
</blockquote>
<p>Das sieht eher aus wie ein Bug, nicht wie ein Feature. Denn auch die Ausgabe von negativen Zahlen funktioniert nicht, z.B. wird aus &quot;b--764&quot; &quot;764&quot;.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Dann eben so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cctype&gt;

using namespace std;

int main()
{
  while (cin)
    if (isdigit(cin.peek()))
      {
        unsigned wert;
        cin &gt;&gt; wert;
        cout &lt;&lt; wert &lt;&lt; '\n';
      }
      else
        cin.ignore(1);
}
</code></pre>
<p>Auch schön kurz und knackig.</p>
<p>P.S.: Oder noch einen Tacken kürzer:</p>
<pre><code class="language-cpp">int main()
{
  do 
    if (isdigit(cin.peek()))
      {
        unsigned wert;
        cin &gt;&gt; wert;
        cout &lt;&lt; wert &lt;&lt; '\n';
      }
  while (cin.ignore(1));
}
</code></pre>
</blockquote>
<p>Jupp, das funktioniert beides. Aber wenn ich das richtig sehe, ist das doch geschummelt, da Du eine C-Bibliothek verwendest, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183291</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Mon, 20 Feb 2012 08:58:13 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Mon, 20 Feb 2012 09:34:53 GMT]]></title><description><![CDATA[<p>redrew99 schrieb:</p>
<blockquote>
<p>Das sieht eher aus wie ein Bug, nicht wie ein Feature. Denn auch die Ausgabe von negativen Zahlen funktioniert nicht, z.B. wird aus &quot;b--764&quot; &quot;764&quot;.</p>
</blockquote>
<p>Nein, das ist vom Standard so vorgesehen.</p>
<blockquote>
<p>Jupp, das funktioniert beides. Aber wenn ich das richtig sehe, ist das doch geschummelt, da Du eine C-Bibliothek verwendest, oder?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> Die C-Bibliothek ist Teil von C++. Aber meinetwegen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;locale&gt;

using namespace std;

int main()
{
  locale loc;
  do
    if (isdigit(cin.peek(), loc))
      {
        unsigned wert;
        cin &gt;&gt; wert;
        cout &lt;&lt; wert &lt;&lt; '\n';
      }
  while (cin.ignore(1));
}
</code></pre>
<p>Ist das jetzt <em>besser</em>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183309</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 20 Feb 2012 09:34:53 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Mon, 20 Feb 2012 10:23:55 GMT]]></title><description><![CDATA[<p>redrew99 schrieb:</p>
<blockquote>
<p>Was ich nicht verstehe ist, warum zusammenhängende Ziffern als Zahl gewertet werden.</p>
</blockquote>
<p>Das liegt einfach daran, dass du nicht Zeichenweise einließt, sondern eine Sequence haben möchtest, in deinem Fall für einen Integer. Und wenn du einen Integer einlesen möchtest, dann ist der Einlesevorgang erst dann beendet, wenn man auf ein nicht-numerisches Zeichen stößt.</p>
<blockquote>
<p>If you do not read character-wise, but extract an integer or a string, for example, you always read past the end of the input sequence. This is because the input operators read characters until they find a separator, or hit the end of the input sequence. Consequently, if the input contains the sequence ... 912749&lt;eof&gt; and an integer is extracted, the eofbit flag (but not failbit) is set.</p>
</blockquote>
<p>Separator für Integer = ein nicht-numerisches Zeichen.</p>
<p>redrew99 schrieb:</p>
<blockquote>
<p>Jupp, das funktioniert beides. Aber wenn ich das richtig sehe, ist das doch geschummelt, da Du eine C-Bibliothek verwendest, oder?</p>
</blockquote>
<p><code>cctype</code> ist in Ordnung, nicht in Ordnung wäre <code>ctype.h</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183324</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 20 Feb 2012 10:23:55 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Mon, 20 Feb 2012 19:55:27 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Das liegt einfach daran, dass du nicht Zeichenweise einließt, sondern eine Sequence haben möchtest, in deinem Fall für einen Integer. Und wenn du einen Integer einlesen möchtest, dann ist der Einlesevorgang erst dann beendet, wenn man auf ein nicht-numerisches Zeichen stößt.</p>
</blockquote>
<p>Ok.</p>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p><code>cctype</code> ist in Ordnung, nicht in Ordnung wäre <code>ctype.h</code></p>
</blockquote>
<p>Ok. Hatte das schon oft gesehen hier, daß von der Verwendung von C-Bibliotheken abgeraten wird, sofern es irgend möglich ist. Aber egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183591</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Mon, 20 Feb 2012 19:55:27 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Mon, 20 Feb 2012 20:29:15 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Nein, das ist vom Standard so vorgesehen.</p>
</blockquote>
<p>Mag sein, die Funktion läßt sich zumindest nicht wirklich verwenden, selbst dann nicht, wenn man negative Zahlen extrahieren lassen möchte.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;locale&gt;

using namespace std;

int main()
{
  locale loc;
  do
    if (isdigit(cin.peek(), loc))
      {
        unsigned wert;
        cin &gt;&gt; wert;
        cout &lt;&lt; wert &lt;&lt; '\n';
      }
  while (cin.ignore(1));
}
</code></pre>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Ist das jetzt <em>besser</em>?</p>
</blockquote>
<p>Sry, aber der Code funktioniert leider nicht.<br />
Aber macht nichts, wir haben 2 funktionierende Versionen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183594</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Mon, 20 Feb 2012 20:29:15 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Mon, 20 Feb 2012 20:10:34 GMT]]></title><description><![CDATA[<p>redrew99 schrieb:</p>
<blockquote>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p><code>cctype</code> ist in Ordnung, nicht in Ordnung wäre <code>ctype.h</code></p>
</blockquote>
<p>Ok. Hatte das schon oft gesehen hier, daß von der Verwendung von C-Bibliotheken abgeraten wird, sofern es irgend möglich ist. Aber egal.</p>
</blockquote>
<p>Das ist richtig, nur hast du es falsch interpretiert: Header, die auf .h enden, sind für C. Für C++ gibt es eine Neuauflage für solche Header, die nicht auf <code>.h</code> enden, sondern mit <code>c</code> vorne anfangen. D.h. <code>cctype</code> ist richtig, <code>ctype.h</code> ist falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183597</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 20 Feb 2012 20:10:34 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Mon, 20 Feb 2012 20:17:41 GMT]]></title><description><![CDATA[<p>redrew99 schrieb:</p>
<blockquote>
<p>Sry, aber der Code funktioniert leider nicht.<br />
Aber macht nichts, wir haben 2 funktionierende Versionen.</p>
</blockquote>
<p>Sehr mitteilsam oder gar selbstständig bist du nicht gerade, oder?</p>
<pre><code class="language-cpp">if (isdigit(static_cast&lt;char&gt;(cin.peek()), loc))
</code></pre>
<p>Und jetzt verstehst du auch vielleicht so langsam, wieso man nicht aus Prinzipientreue gegen schöne gute Standardfunktionen ist, bloß weil es sie in C auch gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183600</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 20 Feb 2012 20:17:41 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Mon, 20 Feb 2012 20:51:44 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Sehr mitteilsam oder gar selbstständig bist du nicht gerade, oder?</p>
</blockquote>
<p>Berechtigte Frage. Schauen wir doch mal.<br />
Nach Deinem Post</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Im Moment sieht das nach einer unendlich umständlichen Art und Weise aus, (bis auf den Fehler) alle Zahlen aus einer Datei auszugeben.</p>
</blockquote>
<p>(man beachte das &quot;unendlich&quot;) habe ich mich hingesetzt und eine funktionierende Version gebastelt.</p>
<p>Sry, aber wer Kritik in der Form wie &quot;unendlich umständlich&quot; äußert, steht in der moralischen Pflicht, es besser zu machen. Interessanterweise gestaltete sich das<br />
&quot;besser machen&quot; doch schwieriger als erwartet.</p>
<p>Davon ab, vielen Dank für das Coaching und die Geduld, an Dich und natürlich an<br />
Gugelmoser. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183619</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Mon, 20 Feb 2012 20:51:44 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Mon, 20 Feb 2012 21:29:41 GMT]]></title><description><![CDATA[<p>Hallo redrew99,</p>
<p>wenn ich das richtig verstanden habe, so geht es doch darum, alles zu überlesen, was keine Zahl ist und anschließend die Zahl zu lesen. Unter der Voraussetzung, dass keine isolierten '-' (und '+'?) Zeichen in der Datei stehen, sollten auch Vorzeichen erlaubt sein, und das ganze sollte von außen schaltbar sein.<br />
Hier mal ein Manipulator, der direkt an der streambuf-Schnittstelle die Zeichen abgreift. In Summe ist das natürlich mehr Code, aber in der Anwendung wird's dann wieder schnuckelig einfach.</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;locale&gt;

template&lt; typename E, typename Traits &gt;
std::basic_istream&lt; E, Traits &gt;&amp; skip_until_number( std::basic_istream&lt; E, Traits &gt;&amp; in )
{
    std::basic_istream&lt; E, Traits &gt;::sentry ok( in );
    if( ok )
    {
        std::ios_base::iostate state = std::ios_base::goodbit;
        try
        {
            const std::ctype&lt; E &gt;&amp; ctype_ = std::use_facet&lt; std::ctype&lt; E &gt; &gt;( in.getloc() );
            for( Traits::int_type m = in.rdbuf()-&gt;sgetc(); ; m = in.rdbuf()-&gt;snextc() )
            {
                if( Traits::eq_int_type( m, Traits::eof() ) )
                {
                    state |= std::ios_base::eofbit;
                    break;
                }
                const E c = Traits::to_char_type( m );
                if( ctype_.is( std::ctype_base::digit, c ) || (in.flags() &amp; std::ios_base::showbase &amp;&amp; (c == E('+') || c == E('-'))) )
                    break;
            }
        }
        catch(...)
        {
            state |= std::ios_base::badbit;
            if( in.exceptions() &amp; std::ios_base::badbit )
                throw;
        }
        in.setstate( state );
    }
    return in;
}

int main()
{
    using namespace std;
    ifstream filestream(&quot;test.txt&quot;);
    filestream &gt;&gt; showbase; // mit showbase ist Vorzeichen erlaubt, ohne nicht
    for( int wert; filestream &gt;&gt; skip_until_number &gt;&gt; wert; )
        cout &lt;&lt; wert &lt;&lt; endl;
    cin.get();
    return 0;
}
</code></pre>
<p>Das 'showbase'-Flag habe ich zweckentfremdet, um mit/ohne Vorzeichen schaltbar zu machen.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183633</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 20 Feb 2012 21:29:41 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Mon, 20 Feb 2012 21:36:57 GMT]]></title><description><![CDATA[<p>Du hast echt nen... gewöhnungsbedürftigen Stil, Werner. <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183637</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 20 Feb 2012 21:36:57 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Mon, 20 Feb 2012 23:32:37 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Hallo redrew99,<br />
wenn ich das richtig verstanden habe, so geht es doch darum, alles zu überlesen, was keine Zahl ist und anschließend die Zahl zu lesen. Unter der Voraussetzung, dass keine isolierten '-' (und '+'?) Zeichen in der Datei stehen, sollten auch Vorzeichen erlaubt sein, und das ganze sollte von außen schaltbar sein.</p>
</blockquote>
<p>Ja, genau. Wenn man schon so ein Programm schreibt, gehört meiner Ansicht nach ein &quot;Schalter&quot; für die Vorzeichen unbedingt mit rein, schließlich weiß man ja nie, ob man negative Zahlen braucht/nicht braucht.Vorstellbare Anwendungen für beides gibt es genug, z.B. Kontenstände(ja) oder Geburtsjahre(nein) auslesen.</p>
<p>Was ich überhaupt nicht verstehe ist, warum die Standardfunktion so gehalten ist, daß bei</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
  int wert;
  while (!(cin &gt;&gt; wert).eof())
    if (cin)
      cout &lt;&lt; wert &lt;&lt; '\n';
    else
      {
        cin.clear();
        cin.ignore(1);
      }
}
</code></pre>
<p>einer Eingabe von z.B. &quot;+-798&quot; &quot;798&quot;, aber bei einer Eingabe von &quot;++-798&quot; &quot;-798&quot; ausgegeben wird. Imho ergibt das keinen Sinn.</p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Hier mal ein Manipulator, der direkt an der streambuf-Schnittstelle die Zeichen abgreift. In Summe ist das natürlich mehr Code, aber in der Anwendung wird's dann wieder schnuckelig einfach.[cpp]</p>
</blockquote>
<p>Autsch. Ganz schöner Brocken.<br />
Davon verstehe ich so gut wie nichts(wegen der Templates), dass muss ich mir erstmal in Ruhe anschauen.<br />
Danke für den Code. <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="🙂"
    /><br />
Bin dann erstmal off, muss morgen früh raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183679</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Mon, 20 Feb 2012 23:32:37 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeichenweise auslesen - newline Problem. on Tue, 21 Feb 2012 11:48:44 GMT]]></title><description><![CDATA[<p>redrew99 schrieb:</p>
<blockquote>
<p>Was ich überhaupt nicht verstehe ist, warum die Standardfunktion so gehalten ist, daß bei</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
  int wert;
  while (!(cin &gt;&gt; wert).eof())
    if (cin)
      cout &lt;&lt; wert &lt;&lt; '\n';
    else
      {
        cin.clear();
        cin.ignore(1);
      }
}
</code></pre>
<p>einer Eingabe von z.B. &quot;+-798&quot; &quot;798&quot;, aber bei einer Eingabe von &quot;++-798&quot; &quot;-798&quot; ausgegeben wird.</p>
</blockquote>
<p>Ich denke, es wird alles klarer, wenn du das Ganze mal so umschreibst und dann +-798 eingibst:</p>
<pre><code class="language-cpp">int main()
{
	int wert;
	while( !(cin &gt;&gt; wert).eof() )
	{
		if( !cin ) // !cin entspricht cin.fail()
		{
        	cin.clear();
        	cin.ignore(1);
        }
        cout &lt;&lt; &quot;Inhalt der Variablen = &quot; &lt;&lt; wert &lt;&lt; '\n';
	}

	/*
		Schritt 1:
			Du willst einen int einlesen.

		Schritt 2:
			Du gibst +-798 ein.

		Schritt 3:
			Das erste Zeichen der Sequence ist ein +. Alles OK, eine Zahl darf ein Vorzeichen haben.

		Schritt 4:
			Das zweite Zeichen der Sequence ist ein -. What? Eine Zahl kann immer nur 1 Vorzeichen haben. D.h. das - ist
			ein nicht-numerisches Zeichen. Nun wird der Einlesevorgang abgebrochen, cin geht in einen Fehlerzustand über,
			und die restlichen Zeichen (-798) bleiben im Puffer stecken. Es wurde also nur das + gelesen, und einfach nur + wird als +0 gehandhabt.
			Die Variable hat also nun den Wert 0.

		Schritt 5:
			!cin ergibt nun true. Mit clear wird cin in seinen gültigen Zustand zurückgeführt und dann wird ein
			im Puffer steckendes Zeichen (-) ignoriert. (ignorieren = das Zeichen lesen und verwerfen)

		Schritt 6:
			Die Variable mit dem Inhalt 0 wird ausgegeben.

		Schritt 7:
			Du willst einen int einelsen.

		Schritt 8:
			Im Puffer befinden sich noch die Zeichen 798. Alles OK, das ist eine positive Ganzzahl. Die Sequence wird gelesen und in der Variable abgespeichert.
			Ein nicht-numerisches Zeichen gab es nicht, cin befindet sich also in keinem Fehlerzustand.

		Schritt 9:
			!cin ergibt false, da sich cin in keinem Fehlerzustand befindet.

		Schritt 10:
			Die Variable mit dem Inhalt 798 wird ausgegeben.

		Nun geht es wieder bei Schritt 1 los.
	*/

    return 0;
}
</code></pre>
<p>Ich hoffe, meine Erklärung hat dir geholfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183860</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 21 Feb 2012 11:48:44 GMT</pubDate></item></channel></rss>