<?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[&#x27;streambuf::underflow&#x27; überschreiben, um Kommentare auszufiltern]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich versuche, beim Lesen über 'std::getline' transparent Kommentare aus dem gelesenen Stream herauszufiltern. Kommentare starten mit '#' und gehen bis zum Ende der Zeile.</p>
<p>Werner hatte hier ja schon öfters Codes gepostet, in denen 'std::streambuf' erweitert und 'underflow' überschrieben wird, um sowas in der Art zu erreichen. Leider finde ich gerade nichts passendes und komme auch mithilfe der Doku nicht weiter. Welche Möglichkeiten zur Manipulation des gelesenen Streams habe ich hier denn?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/215640/streambuf-underflow-überschreiben-um-kommentare-auszufiltern</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 00:03:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215640.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 13 Jun 2008 14:47:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &#x27;streambuf::underflow&#x27; überschreiben, um Kommentare auszufiltern on Fri, 13 Jun 2008 14:47:35 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich versuche, beim Lesen über 'std::getline' transparent Kommentare aus dem gelesenen Stream herauszufiltern. Kommentare starten mit '#' und gehen bis zum Ende der Zeile.</p>
<p>Werner hatte hier ja schon öfters Codes gepostet, in denen 'std::streambuf' erweitert und 'underflow' überschrieben wird, um sowas in der Art zu erreichen. Leider finde ich gerade nichts passendes und komme auch mithilfe der Doku nicht weiter. Welche Möglichkeiten zur Manipulation des gelesenen Streams habe ich hier denn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1528460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1528460</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 13 Jun 2008 14:47:35 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;streambuf::underflow&#x27; überschreiben, um Kommentare auszufiltern on Sat, 14 Jun 2008 10:39:29 GMT]]></title><description><![CDATA[<p>hola</p>
<p>vielleicht funktioniert es so:</p>
<pre><code class="language-cpp">class my_buf : public std::filebuf
{
   public:
      typedef std::filebuf::int_type int_type;
      virtual int_type uflow(void)
      {
         int_type c = filebuf::uflow();
         if(static_cast&lt;char&gt;(c) == '#')
         {
            while((c = gnextc()) != EOF &amp;&amp; c != '\n');
         }

         return c;
      }
}
</code></pre>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1528852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1528852</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sat, 14 Jun 2008 10:39:29 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;streambuf::underflow&#x27; überschreiben, um Kommentare auszufiltern on Sat, 14 Jun 2008 11:13:48 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Werner hatte hier ja schon öfters Codes gepostet, in denen 'std::streambuf' erweitert und 'underflow' überschrieben wird, um sowas in der Art zu erreichen.</p>
</blockquote>
<p>Hallo Konrad,</p>
<p>streambuf erweitern ja, aber mit Filter-Funktion ... daran kann ich mich nicht erinnern. Ich würde Dir entweder was in der Art vorschlagen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cassert&gt;
#include &lt;streambuf&gt;
#include &lt;sstream&gt;

class CommentFilter : public std::streambuf
{
public:
    explicit CommentFilter( std::streambuf* sb )
        : base_type()
        , m_c()
        , m_target( sb )
    {
        assert( m_target );
    }
protected:
    virtual int_type underflow()
    {
        bool comment = false;
        for( int_type m = m_target-&gt;sbumpc();; m = m_target-&gt;sbumpc() )
        {
            if( traits_type::eq_int_type( m, traits_type::eof() ) )
                return traits_type::eof();
            const char c = traits_type::to_char_type( m );
            if( comment )
            {
                if( c == '\n' )
                    comment = false;
                else
                    continue;
            }
            if( c != '#' )
            {
                m_c = c;
                setg( &amp;m_c, &amp;m_c, &amp;m_c + 1 );
                return m;
            }
            comment = true;
        }
    }

private:
    typedef std::streambuf base_type;
    char m_c;   // das letzte gelesene Zeichen
    std::streambuf* m_target;
};

int main()
{
    using namespace std;
    istringstream buf(&quot;1.Zeile\n2.Zeile#kommentar\n3.Zeile\n&quot;);
    CommentFilter flt( buf.rdbuf() );
    istream in( &amp;flt );
    cout &lt;&lt; in.rdbuf() &lt;&lt; &quot;-- ende --&quot; &lt;&lt; endl;   // hier ginge natürlich auch: cout &lt;&lt; &amp;flt;
    return 0;
}
</code></pre>
<p>oder Du schaust Dir mal die <a href="http://www.boost.org/doc/libs/1_35_0/libs/iostreams/doc/index.html" rel="nofollow">boost-iostreams</a> an. Die bieten auch Filter an. Ich habe das selber aber noch nicht benutzt.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1528873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1528873</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sat, 14 Jun 2008 11:13:48 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;streambuf::underflow&#x27; überschreiben, um Kommentare auszufiltern on Sat, 14 Jun 2008 13:10:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>vielen Dank an euch beide, das ist gut. Boost bietet sich in diesem Fall nicht an, obowhl ich generell immer dafür bin, Boost-Lösungen zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1528964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1528964</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 14 Jun 2008 13:10:09 GMT</pubDate></item></channel></rss>