<?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::streambuf überladen ...]]></title><description><![CDATA[<p>Also, hab für einen User von einem anderen Forum mal einer Problematik versucht zu lösen. Das Problem ist, dass er er in einen Stream was reinschreiben will, und das dann in 2 Streams (file &amp; cout z.B.) ausgegeben werden soll.</p>
<p>Dafür eignet es sich ja am besten, direkt auf Buffer ebene zu arbeiten:</p>
<pre><code class="language-cpp">#include &lt;streambuf&gt;

template&lt;typename _elem, typename _traits = std::char_traits&lt;_elem&gt; &gt;
class basic_dualstreambuf : public std::basic_streambuf&lt;_elem, _traits &gt;
{
    std::basic_streambuf&lt;_elem, _traits&gt;*        m_first;
    std::basic_streambuf&lt;_elem, _traits&gt;*        m_second;

protected:
    typedef typename _traits traits_t;
	typedef typename traits_t::int_type int_t;

    virtual int_t overflow(int_t c = traits_t::eof())
    {
        if (traits_t::eq_int_type(c, traits_t::eof()) == true) return traits_t::not_eof(c);
        c = m_first-&gt;sputc(c);
	return (traits_t::eq_int_type(c, traits_t::eof()) == false ? m_second-&gt;overflow() : c);
    }

    virtual int sync()
    { return (m_first-&gt;sync() != -1 ? m_second-&gt;sync() : -1); }

public:
    explicit two_streambuf (std::basic_streambuf&lt;_elem, _traits&gt;* ptr_first, std::basic_streambuf&lt;_elem, _traits&gt;* ptr_second)
        : m_first(ptr_first), m_second(ptr_second)
    {}
};

typedef basic_dualstreambuf&lt;char&gt; dualstreambuf;
typedef basic_dualstreambuf&lt;wchar_t&gt; wdualstreambuf;
</code></pre>
<p>. Da meckert der VC++ 2005 aber:</p>
<pre><code>_console_test_project.h(187) : error C2248: 'std::basic_streambuf&lt;_Elem,_Traits&gt;::overflow' : cannot access protected member declared in class 'std::basic_streambuf&lt;_Elem,_Traits&gt;'
        with
        [
            _Elem=char,
            _Traits=std::char_traits&lt;char&gt;
        ]
        c:\programme\microsoft visual studio 8\vc\include\streambuf(297) : see declaration of 'std::basic_streambuf&lt;_Elem,_Traits&gt;::overflow'
        with
        [
            _Elem=char,
            _Traits=std::char_traits&lt;char&gt;
        ]
        _console_test_project.h(184) : while compiling class template member function 'int basic_dualstreambuf&lt;_elem&gt;::overflow(int)'
        with
        [
            _elem=char
        ]
        _console_test_project.h(203) : see reference to class template instantiation 'basic_dualstreambuf&lt;_elem&gt;' being compiled
        with
        [
            _elem=char
        ]
</code></pre>
<p>wenn ich es bsw. mal so teste:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;iostream&gt;

int main()
{
	std::ofstream file_stream(&quot;test.txt&quot;);
	dualstreambuf buffer(std::cout.rdbuf(), file_stream.rdbuf());
	std::clog.rdbuf(&amp;buffer);
	std::cout &lt;&lt; &quot;Test 001&quot; &lt;&lt; std::endl;
}
</code></pre>
<p>. Jemand eine Idee wie ich das umgehen kann?</p>
<p>Hab mich nach meinem ersten Versuch (s. oben) mal schlau gemacht aber auch nur gefunden, dass overflow überladen werden muss ... und das hab ich ja nunmal versucht <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="😉"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Vlg Deviloper</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202363/std-streambuf-überladen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 07:47:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202363.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Jan 2008 16:26:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::streambuf überladen ... on Thu, 10 Jan 2008 16:27:08 GMT]]></title><description><![CDATA[<p>Also, hab für einen User von einem anderen Forum mal einer Problematik versucht zu lösen. Das Problem ist, dass er er in einen Stream was reinschreiben will, und das dann in 2 Streams (file &amp; cout z.B.) ausgegeben werden soll.</p>
<p>Dafür eignet es sich ja am besten, direkt auf Buffer ebene zu arbeiten:</p>
<pre><code class="language-cpp">#include &lt;streambuf&gt;

template&lt;typename _elem, typename _traits = std::char_traits&lt;_elem&gt; &gt;
class basic_dualstreambuf : public std::basic_streambuf&lt;_elem, _traits &gt;
{
    std::basic_streambuf&lt;_elem, _traits&gt;*        m_first;
    std::basic_streambuf&lt;_elem, _traits&gt;*        m_second;

protected:
    typedef typename _traits traits_t;
	typedef typename traits_t::int_type int_t;

    virtual int_t overflow(int_t c = traits_t::eof())
    {
        if (traits_t::eq_int_type(c, traits_t::eof()) == true) return traits_t::not_eof(c);
        c = m_first-&gt;sputc(c);
	return (traits_t::eq_int_type(c, traits_t::eof()) == false ? m_second-&gt;overflow() : c);
    }

    virtual int sync()
    { return (m_first-&gt;sync() != -1 ? m_second-&gt;sync() : -1); }

public:
    explicit two_streambuf (std::basic_streambuf&lt;_elem, _traits&gt;* ptr_first, std::basic_streambuf&lt;_elem, _traits&gt;* ptr_second)
        : m_first(ptr_first), m_second(ptr_second)
    {}
};

typedef basic_dualstreambuf&lt;char&gt; dualstreambuf;
typedef basic_dualstreambuf&lt;wchar_t&gt; wdualstreambuf;
</code></pre>
<p>. Da meckert der VC++ 2005 aber:</p>
<pre><code>_console_test_project.h(187) : error C2248: 'std::basic_streambuf&lt;_Elem,_Traits&gt;::overflow' : cannot access protected member declared in class 'std::basic_streambuf&lt;_Elem,_Traits&gt;'
        with
        [
            _Elem=char,
            _Traits=std::char_traits&lt;char&gt;
        ]
        c:\programme\microsoft visual studio 8\vc\include\streambuf(297) : see declaration of 'std::basic_streambuf&lt;_Elem,_Traits&gt;::overflow'
        with
        [
            _Elem=char,
            _Traits=std::char_traits&lt;char&gt;
        ]
        _console_test_project.h(184) : while compiling class template member function 'int basic_dualstreambuf&lt;_elem&gt;::overflow(int)'
        with
        [
            _elem=char
        ]
        _console_test_project.h(203) : see reference to class template instantiation 'basic_dualstreambuf&lt;_elem&gt;' being compiled
        with
        [
            _elem=char
        ]
</code></pre>
<p>wenn ich es bsw. mal so teste:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;iostream&gt;

int main()
{
	std::ofstream file_stream(&quot;test.txt&quot;);
	dualstreambuf buffer(std::cout.rdbuf(), file_stream.rdbuf());
	std::clog.rdbuf(&amp;buffer);
	std::cout &lt;&lt; &quot;Test 001&quot; &lt;&lt; std::endl;
}
</code></pre>
<p>. Jemand eine Idee wie ich das umgehen kann?</p>
<p>Hab mich nach meinem ersten Versuch (s. oben) mal schlau gemacht aber auch nur gefunden, dass overflow überladen werden muss ... und das hab ich ja nunmal versucht <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="😉"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Vlg Deviloper</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434431</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Thu, 10 Jan 2008 16:27:08 GMT</pubDate></item><item><title><![CDATA[Reply to std::streambuf überladen ... on Thu, 10 Jan 2008 17:18:17 GMT]]></title><description><![CDATA[<p>Ja - der Compiler hat recht. Du darfst nicht die protected Methode eines anderen Objekts aufrufen und geanu das tust Du hier. Benutze doch genauso das sputc wie bei m_first auch. Außerdem ist die Abfrage aud EOF doppelt vorhanden.<br />
Für sync gilt das gleiche.</p>
<p>Das ganze könnte etwa so laufen:</p>
<pre><code class="language-cpp">virtual int_t overflow( int_t c = traits_t::eof() )
    {
        if (traits_t::eq_int_type(c, traits_t::eof())) 
            return traits_t::not_eof(c);
        const char cc = traits_t::to_char_type( c );
        return (traits_t::eq_int_type( m_first-&gt;sputc(cc), traits_t::eof() )
            || traits_t::eq_int_type( m_second-&gt;sputc(cc), traits_t::eof() ))? traits_t::eof(): traits_t::not_eof(c);
    }

    virtual int sync()
    { return (m_first-&gt;pubsync() == 0 &amp;&amp; m_second-&gt;pubsync() == 0? 0: -1); }
</code></pre>
<p>Im übrigen solltest Du die Buffer immer wieder zurücksetzen - insbesondere den von clog.</p>
<p>Das hatten wir auch schon mal .. <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-116667-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-streambuf-and-start-is-17.html" rel="nofollow">hier ist so eine Weiche</a> implementiert. Die Weiche übernimmt auch das Rücksetzen.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434470</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 10 Jan 2008 17:18:17 GMT</pubDate></item><item><title><![CDATA[Reply to std::streambuf überladen ... on Thu, 10 Jan 2008 17:45:24 GMT]]></title><description><![CDATA[<p>zugriffsschutz. die elementfunktionen sind protected, damit kann deine klasse sie nicht (über einen zeiger auf basic_streambuf) aufrufen, nur über this-&gt;... ist ein zugriff auf geschützte memberfunktionen möglich. das würde bedeuten, du müsstest ableiten.<br />
nur: dann könntest du deinem dualstreambuf nicht zwei streambuffer zuweisen, vor allem könntest du deinem dualstreambuf nicht den streambuf von cout/cin zuweisen.</p>
<p>das lässt dir zwei alternativen.<br />
(a) du moppelst doppelt und bufferst die ausgabe deines streambufs nochmal auf den beiden streambufs, die du als zeiger verwendest (damit ist dein streambuf so eine art proxy-stream), du kannst natürlich den internen buffer deiner streambufs auf 0 setzen, dann hast du de facto auch nur mehr einen buffer. //anmerkung: sehe gerade, das Werner Salomon genau so etwas vorschlägt <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 />
(b) du schreibst dir eine eigene streamklasse, die zwei streambufs für die ausgabe verwendet.</p>
<p>PS namen mit einem unterstrich beginnen zu lassen ist böse!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434475</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Thu, 10 Jan 2008 17:45:24 GMT</pubDate></item><item><title><![CDATA[Reply to std::streambuf überladen ... on Tue, 11 Mar 2008 16:12:20 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;typename _elem, typename _traits = std::char_traits&lt;_elem&gt; &gt;
class basic_dualstreambuf : public std::basic_streambuf&lt;_elem, _traits &gt;
{
    std::basic_streambuf&lt;_elem, _traits&gt;*        m_first;
    std::basic_streambuf&lt;_elem, _traits&gt;*        m_second;

protected:
    virtual int_type overflow(int_type c = traits_type::eof())
	{
        return ((m_first &amp;&amp; m_second &amp;&amp; !traits_type::eq_int_type(m_first-&gt;sputc(c), traits_type::eof()) &amp;&amp; !traits_type::eq_int_type(m_second-&gt;sputc(c), traits_type::eof())) ? 
			traits_type::not_eof(c) : traits_type::eof());
    }

public:
    explicit basic_dualstreambuf (std::basic_streambuf&lt;_elem, _traits&gt;* ptr_first, std::basic_streambuf&lt;_elem, _traits&gt;* ptr_second)
        : m_first(ptr_first), m_second(ptr_second)
    {}
};

typedef basic_dualstreambuf&lt;char&gt; dualstreambuf;
typedef basic_dualstreambuf&lt;wchar_t&gt; wdualstreambuf;
</code></pre>
<p>... warum wird nur ein verdammtes Zeichen angehangen? Da stimmt doch was nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1472251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1472251</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 11 Mar 2008 16:12:20 GMT</pubDate></item><item><title><![CDATA[Reply to std::streambuf überladen ... on Wed, 12 Mar 2008 05:45:03 GMT]]></title><description><![CDATA[<p>hola</p>
<p>vielleicht hilft dir einer der beiden links weiter:<br />
<a href="http://spec.winprog.org/streams/" rel="nofollow">http://spec.winprog.org/streams/</a><br />
<a href="http://www.icce.rug.nl/documents/cplusplus/cplusplus05.html" rel="nofollow">http://www.icce.rug.nl/documents/cplusplus/cplusplus05.html</a></p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1472506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1472506</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Wed, 12 Mar 2008 05:45:03 GMT</pubDate></item></channel></rss>