<?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[ifstream und get() unerwartetes Verhalten]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich habe eine Text datei wo eine Zeile wie:</p>
<blockquote>
<p>2345 012345678901234</p>
</blockquote>
<p>steht. Nach dem letzten ziffer steht keine escape zeichen, keine newline oder<br />
sonst was anderes...</p>
<p>Wenn ich mit Hilfe von ifstream::get() die Zeile in meine buffers einlese, kriege ich von dem zweiten buffer unerwartete Zeichenausgabe..</p>
<pre><code class="language-cpp">unsigned counter ;
char receiver_buffer[16];
char control ;
ifstream* portfile ;
// ..

// Parse Zweiter Teil = 012345678901234    max laenge 15 chars
for(counter=0 ; counter&lt;sizeof(receiver_buffer)-1 ; counter++){
 if((control = portfile-&gt;get()) == ' ' )   // lese zeichen fuer zeichen ein
   break ;                                 // space getroffen: wir 'haben' fertig

 receiver_buffer[counter] = control ;
}

cout &lt;&lt;  receiver_buffer &lt;&lt;endl;
</code></pre>
<p>Die schleife wird 15 ausgefuehrt. Bei jedesmal lese ich via ifstream::get() ein<br />
char ein. Bei dem letzten Durchgang, bin ich an dem letzten Zeichen und noch<br />
nicht am &quot;eof&quot;. Die schleife wird verlassen ohne eof check zu benoetigen...</p>
<p>Was aber dabei rauskommt:</p>
<blockquote>
<p>012345678901-234</p>
</blockquote>
<p>Das letzte Character wird dabei voellig daneben geparst. Dasselbe code habe<br />
ich an einer anderen Maschine compiliert. Das Parsen funktioniert tadellos:</p>
<blockquote>
<p>012345678901234</p>
</blockquote>
<p>Macht get() nichts anderes als ein zeichen zu lesen und den iterator in<br />
der Datei zu naechstem char zu bewegen? Ich kann mir vorstellen dass er beim<br />
letzten Char rueckgabe, den eof bit einsetzt. Aber wieso kriege ich trotzdem<br />
solche Zeichen wenn ich schon die Schleife verlassen habe?</p>
<p>Danke im voraus,</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/210497/ifstream-und-get-unerwartetes-verhalten</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 13:38:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/210497.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 Apr 2008 16:54:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ifstream und get() unerwartetes Verhalten on Fri, 11 Apr 2008 16:54:33 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich habe eine Text datei wo eine Zeile wie:</p>
<blockquote>
<p>2345 012345678901234</p>
</blockquote>
<p>steht. Nach dem letzten ziffer steht keine escape zeichen, keine newline oder<br />
sonst was anderes...</p>
<p>Wenn ich mit Hilfe von ifstream::get() die Zeile in meine buffers einlese, kriege ich von dem zweiten buffer unerwartete Zeichenausgabe..</p>
<pre><code class="language-cpp">unsigned counter ;
char receiver_buffer[16];
char control ;
ifstream* portfile ;
// ..

// Parse Zweiter Teil = 012345678901234    max laenge 15 chars
for(counter=0 ; counter&lt;sizeof(receiver_buffer)-1 ; counter++){
 if((control = portfile-&gt;get()) == ' ' )   // lese zeichen fuer zeichen ein
   break ;                                 // space getroffen: wir 'haben' fertig

 receiver_buffer[counter] = control ;
}

cout &lt;&lt;  receiver_buffer &lt;&lt;endl;
</code></pre>
<p>Die schleife wird 15 ausgefuehrt. Bei jedesmal lese ich via ifstream::get() ein<br />
char ein. Bei dem letzten Durchgang, bin ich an dem letzten Zeichen und noch<br />
nicht am &quot;eof&quot;. Die schleife wird verlassen ohne eof check zu benoetigen...</p>
<p>Was aber dabei rauskommt:</p>
<blockquote>
<p>012345678901-234</p>
</blockquote>
<p>Das letzte Character wird dabei voellig daneben geparst. Dasselbe code habe<br />
ich an einer anderen Maschine compiliert. Das Parsen funktioniert tadellos:</p>
<blockquote>
<p>012345678901234</p>
</blockquote>
<p>Macht get() nichts anderes als ein zeichen zu lesen und den iterator in<br />
der Datei zu naechstem char zu bewegen? Ich kann mir vorstellen dass er beim<br />
letzten Char rueckgabe, den eof bit einsetzt. Aber wieso kriege ich trotzdem<br />
solche Zeichen wenn ich schon die Schleife verlassen habe?</p>
<p>Danke im voraus,</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1490484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1490484</guid><dc:creator><![CDATA[jsbach]]></dc:creator><pubDate>Fri, 11 Apr 2008 16:54:33 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream und get() unerwartetes Verhalten on Fri, 11 Apr 2008 17:56:52 GMT]]></title><description><![CDATA[<p>Du solltest zuerst deinen Puffer mit Nullen füllen (oder zumindestens abschließend eine Null setzen):</p>
<pre><code class="language-cpp">char receiver_buffer[16] = { 0 };

// bzw. vor der Ausgabe
receiver_buffer[15] = '\0';
</code></pre>
<p>Ansonsten hast du irgendeinen undefinierten C-String (denn die Ausgabe endet erst beim ersten (binären) Null-Zeichen)...</p>
<p>P.S: Mit std::string wäre dir das nicht passiert -)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1490513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1490513</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Fri, 11 Apr 2008 17:56:52 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream und get() unerwartetes Verhalten on Sat, 12 Apr 2008 11:18:51 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Th69 schrieb:</p>
<blockquote>
<p>Du solltest zuerst deinen Puffer mit Nullen füllen (oder zumindestens abschließend eine Null setzen):</p>
<pre><code class="language-cpp">char receiver_buffer[16] = { 0 };
// bzw. vor der Ausgabe
receiver_buffer[15] = '\0';
</code></pre>
<p>Ansonsten hast du irgendeinen undefinierten C-String (denn die Ausgabe endet erst beim ersten (binären) Null-Zeichen)...</p>
</blockquote>
<p>Das erklaert schon mal alles. Danke.</p>
<p>Was mich als zweites interessiert ist, dass dasselbe Code an einem anderen<br />
Maschine ohne oben geschildertes Problem ausgegeben wird. Es sieht so aus,<br />
als ob dieser compiler automatisch die Elemente des Arrays auf '\0' setzt, oder?<br />
Anders kann ich mir nicht vorstellen..Gibt's einen Weg solche Unterschiede<br />
zwischen Compilern festzustellen?</p>
<p>Danke,</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1490761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1490761</guid><dc:creator><![CDATA[jsbach]]></dc:creator><pubDate>Sat, 12 Apr 2008 11:18:51 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream und get() unerwartetes Verhalten on Sat, 12 Apr 2008 11:37:43 GMT]]></title><description><![CDATA[<p>jsbach schrieb:</p>
<blockquote>
<p>Es sieht so aus, als ob dieser compiler automatisch die Elemente des Arrays auf '\0' setzt, oder? Anders kann ich mir nicht vorstellen..Gibt's einen Weg solche Unterschiede zwischen Compilern festzustellen?,</p>
</blockquote>
<p>Kann genauso gut Zufall sein. Einen nicht null-terminiertes char Array als C-String zu behandeln ist ein Programmmierfehler. Genauso wie das Semikolon am Ende einer Anweisung zu vergessen, nur das der Kompiler diesen Fehler nicht feststellen kann. Wenn du also wirklich mit C-Strings arbeiten musst, musst du dich auch darum kümern, dass sie zu jedem Zeitpunkt, an denen du sie benutzt, auch brauchbar sind (passende Länge, null-terminiert). std::string nimmt dir all diese Arbeit ab.</p>
<p>Gruß<br />
Don06</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1490771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1490771</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Sat, 12 Apr 2008 11:37:43 GMT</pubDate></item></channel></rss>