<?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[fstreams und putback?]]></title><description><![CDATA[<p>Hallo, ich habe mir einen kleinen Tokenizer für Config Files geschrieben.<br />
Leider macht mir hier die putback Funktion schwer zu schaffen.<br />
Wenn ich versuche Zeichen, die ich eingelesen habe wieder in den Stream zu stecken scheitert das kläglich und es wird beim nächsten Aufruf einfach nicht das zuletzt hineingesteckte Zeichen bearbeitet.</p>
<p>Hier der Code</p>
<pre><code class="language-cpp">tokentype parser::parse_token()
{
        TokenType=CLEAN;
        string keywords[]={&quot;{&quot;,
                           &quot;}&quot;,
                           &quot;/*&quot;,
                           &quot;*/&quot;,
                           &quot;//&quot;,
                           &quot;,&quot;,
                           &quot;\n&quot;}; // Basic keywords
        string Tag=&quot;&quot;;
        string buf=&quot;&quot;;
        char ch;
        bool delimfound=false;
        while (stream.get(ch) &amp;&amp; (!delimfound))  &lt;---- Hier ist der Fehler
        {
                Tag+=ch;
                // cout &lt;&lt; &quot;:&quot; &lt;&lt; ch &lt;&lt; endl;
                for (int i=0; i&lt;sizeof(keywords)/sizeof(string); i++)
                {
                        string back=&quot;&quot;;
                        int pos=Tag.find(keywords[i]);
                        if (pos!=string::npos) {
                                int len=keywords[i].length();
                                if (Tag.length()!=len){               // delimiter splits here our token otherwise we would only have the delimiter processed
                                        back=Tag.substr(pos, len);
                                        Tag.erase(pos, len);
                                        for (int i=0; i&lt;len; i++){
                                                stream.putback(back.c_str()[i]);
                                                cout &lt;&lt; &quot;zurueck&quot; &lt;&lt; back &lt;&lt; &quot; Tag=&quot; &lt;&lt; Tag &lt;&lt; endl;
                                        }
                                } // else cout &lt;&lt; int(ch) &lt;&lt; endl;
                                delimfound=true;
                                break;
                        }
                }

        }
        // stream.putback('!');
        TokenString=Tag;
        if (Tag.length()&gt;0) cout &lt;&lt; Tag &lt;&lt; endl;
        return OTHER;
}
</code></pre>
<p>tokentype usw sind einfach nur enums<br />
In Zeile 30 stecke ich Zeichen zurück wenn ich merke das diese zum nächsten Token gehören sollten</p>
<p>stream ist dabei ein fstream<br />
Wenn ich das cout in Zeile 18 auskommentiere bringt er mir allerdings nicht das von 167 hineingesteckte Zeichen beim nächsten aufruf zurück.</p>
<p>Woran könnte das liegen</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/161299/fstreams-und-putback</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 20:00:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/161299.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Oct 2006 10:33:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to fstreams und putback? on Thu, 05 Oct 2006 10:53:44 GMT]]></title><description><![CDATA[<p>Hallo, ich habe mir einen kleinen Tokenizer für Config Files geschrieben.<br />
Leider macht mir hier die putback Funktion schwer zu schaffen.<br />
Wenn ich versuche Zeichen, die ich eingelesen habe wieder in den Stream zu stecken scheitert das kläglich und es wird beim nächsten Aufruf einfach nicht das zuletzt hineingesteckte Zeichen bearbeitet.</p>
<p>Hier der Code</p>
<pre><code class="language-cpp">tokentype parser::parse_token()
{
        TokenType=CLEAN;
        string keywords[]={&quot;{&quot;,
                           &quot;}&quot;,
                           &quot;/*&quot;,
                           &quot;*/&quot;,
                           &quot;//&quot;,
                           &quot;,&quot;,
                           &quot;\n&quot;}; // Basic keywords
        string Tag=&quot;&quot;;
        string buf=&quot;&quot;;
        char ch;
        bool delimfound=false;
        while (stream.get(ch) &amp;&amp; (!delimfound))  &lt;---- Hier ist der Fehler
        {
                Tag+=ch;
                // cout &lt;&lt; &quot;:&quot; &lt;&lt; ch &lt;&lt; endl;
                for (int i=0; i&lt;sizeof(keywords)/sizeof(string); i++)
                {
                        string back=&quot;&quot;;
                        int pos=Tag.find(keywords[i]);
                        if (pos!=string::npos) {
                                int len=keywords[i].length();
                                if (Tag.length()!=len){               // delimiter splits here our token otherwise we would only have the delimiter processed
                                        back=Tag.substr(pos, len);
                                        Tag.erase(pos, len);
                                        for (int i=0; i&lt;len; i++){
                                                stream.putback(back.c_str()[i]);
                                                cout &lt;&lt; &quot;zurueck&quot; &lt;&lt; back &lt;&lt; &quot; Tag=&quot; &lt;&lt; Tag &lt;&lt; endl;
                                        }
                                } // else cout &lt;&lt; int(ch) &lt;&lt; endl;
                                delimfound=true;
                                break;
                        }
                }

        }
        // stream.putback('!');
        TokenString=Tag;
        if (Tag.length()&gt;0) cout &lt;&lt; Tag &lt;&lt; endl;
        return OTHER;
}
</code></pre>
<p>tokentype usw sind einfach nur enums<br />
In Zeile 30 stecke ich Zeichen zurück wenn ich merke das diese zum nächsten Token gehören sollten</p>
<p>stream ist dabei ein fstream<br />
Wenn ich das cout in Zeile 18 auskommentiere bringt er mir allerdings nicht das von 167 hineingesteckte Zeichen beim nächsten aufruf zurück.</p>
<p>Woran könnte das liegen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149800</guid><dc:creator><![CDATA[Procrash]]></dc:creator><pubDate>Thu, 05 Oct 2006 10:53:44 GMT</pubDate></item><item><title><![CDATA[Reply to fstreams und putback? on Thu, 05 Oct 2006 10:46:13 GMT]]></title><description><![CDATA[<p>Ich bin mir nicht sicher, ob du die Zeichen in der richtigen (sprich: umgekehrten) Reihenfolge zurück in den Stream steckst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149805</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Thu, 05 Oct 2006 10:46:13 GMT</pubDate></item><item><title><![CDATA[Reply to fstreams und putback? on Thu, 05 Oct 2006 10:53:16 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Ich bin mir nicht sicher, ob du die Zeichen in der richtigen (sprich: umgekehrten) Reihenfolge zurück in den Stream steckst.</p>
</blockquote>
<p>Ne ich hab ihn schon gefunden.<br />
Der war mies. Die Reihenfolge von der while Bdeingung wird ja von links nach rechts ausgewertet.<br />
Ich musste die delimiter Bedingung natürlich vor der stream.get(ch) Bedingung auswerten lassen, sonst wird auf jeden fall noch ein Zeichen gelesen.<br />
In diesem Fall war dies mein zurückgestecktes Zeichen...</p>
<p>Ne richtige Kopfnuss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149816</guid><dc:creator><![CDATA[Procrash]]></dc:creator><pubDate>Thu, 05 Oct 2006 10:53:16 GMT</pubDate></item><item><title><![CDATA[Reply to fstreams und putback? on Thu, 05 Oct 2006 11:29:22 GMT]]></title><description><![CDATA[<p>Die vom Standard garantierte Größe des Putback-Buffers ist 1. Wenn du mehr brauchst, mußt du dir einen eigenen Buffer schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149838</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Thu, 05 Oct 2006 11:29:22 GMT</pubDate></item><item><title><![CDATA[Reply to fstreams und putback? on Fri, 06 Oct 2006 00:43:17 GMT]]></title><description><![CDATA[<p>Z2 schrieb:</p>
<blockquote>
<p>Die vom Standard garantierte Größe des Putback-Buffers ist 1. Wenn du mehr brauchst, mußt du dir einen eigenen Buffer schreiben.</p>
</blockquote>
<p>Was heißt dass denn?<br />
Das ich nicht mehr als ein Zeichen zurück in den Stream schicken kann?<br />
Das kanns doch nicht sein oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1150269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1150269</guid><dc:creator><![CDATA[Procrash]]></dc:creator><pubDate>Fri, 06 Oct 2006 00:43:17 GMT</pubDate></item><item><title><![CDATA[Reply to fstreams und putback? on Fri, 06 Oct 2006 07:12:53 GMT]]></title><description><![CDATA[<p>Es ist möglich, daß deine Implementierung der STL mehr als ein Zeichen zuläßt. Das ist aber eben implementierungsabhängig. Wenn du portabel bleiben willst, bist du auf ein Zeichen beschränkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1150323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1150323</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Fri, 06 Oct 2006 07:12:53 GMT</pubDate></item></channel></rss>