<?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[stream manipulator fuer colored console output]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>um die wichtigesten Ereignise in meinen Programmen hervorzuheben wollte ich einen stream manipulator erstellen der mir die aktuelle font/background color setzt.</p>
<p>Jetzt hab ich dazu Fragen:</p>
<p>ich hab mir das ca so vergestellt:</p>
<pre><code class="language-cpp">std::cout &lt;&lt; &quot;[timestamp] - &quot; &lt;&lt; color(RED) &lt;&lt; &quot;error&quot; &lt;&lt; color(DEFAULT) &lt;&lt; &quot;[text]&quot; &lt;&lt; &quot;\n&quot;;
//oder
std::cout &lt;&lt; &quot;connected to: &quot; &lt;&lt; color(GREEN) &lt;&lt; &quot;[ip]&quot; &lt;&lt; &quot;\n&quot;;
std::cout &lt;&lt; &quot;normal text\n&quot;; // dieser text soll jetzt wieder in der default farbe sein.
//oder fuer font/background color
std::cout &lt;&lt; color(BLACK, WHITE) &lt;&lt; &quot;text with different background/font&quot; &lt;&lt; &quot;\n&quot;; // hier das gleiche nach einem \n soll wieder auf default geschaltet werden
</code></pre>
<p>Seh ich des richtig, dass ich jetzt einen manipulator functor (wegen den 2 parametern glaub ich, muss sagen so 100%ig kenn ich mich mit dennen ned aus) &quot;color&quot; erstelle und ich aber zusaetzlich eine class schreiben muss die von streambuf erbt (so wies Werner Salomon mit dem XOR gemacht hat) um zu erkennen wann ein &quot;\n&quot; oder ein beliebiges token kommt und ich die color wieder auf default setzen kann?</p>
<p>Gibt zu den Streams / Manipulator im Internet eine gute Referenz.<br />
Hab den Buch vorschlag (glaub auch von Werner Salomon) gesehen aber ein ganzes Buch fuer das ist mir eigenlich zu viel.</p>
<p>Gruessle stuxn</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/310359/stream-manipulator-fuer-colored-console-output</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 19:21:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310359.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Nov 2012 14:28:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to stream manipulator fuer colored console output on Fri, 09 Nov 2012 14:28:41 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>um die wichtigesten Ereignise in meinen Programmen hervorzuheben wollte ich einen stream manipulator erstellen der mir die aktuelle font/background color setzt.</p>
<p>Jetzt hab ich dazu Fragen:</p>
<p>ich hab mir das ca so vergestellt:</p>
<pre><code class="language-cpp">std::cout &lt;&lt; &quot;[timestamp] - &quot; &lt;&lt; color(RED) &lt;&lt; &quot;error&quot; &lt;&lt; color(DEFAULT) &lt;&lt; &quot;[text]&quot; &lt;&lt; &quot;\n&quot;;
//oder
std::cout &lt;&lt; &quot;connected to: &quot; &lt;&lt; color(GREEN) &lt;&lt; &quot;[ip]&quot; &lt;&lt; &quot;\n&quot;;
std::cout &lt;&lt; &quot;normal text\n&quot;; // dieser text soll jetzt wieder in der default farbe sein.
//oder fuer font/background color
std::cout &lt;&lt; color(BLACK, WHITE) &lt;&lt; &quot;text with different background/font&quot; &lt;&lt; &quot;\n&quot;; // hier das gleiche nach einem \n soll wieder auf default geschaltet werden
</code></pre>
<p>Seh ich des richtig, dass ich jetzt einen manipulator functor (wegen den 2 parametern glaub ich, muss sagen so 100%ig kenn ich mich mit dennen ned aus) &quot;color&quot; erstelle und ich aber zusaetzlich eine class schreiben muss die von streambuf erbt (so wies Werner Salomon mit dem XOR gemacht hat) um zu erkennen wann ein &quot;\n&quot; oder ein beliebiges token kommt und ich die color wieder auf default setzen kann?</p>
<p>Gibt zu den Streams / Manipulator im Internet eine gute Referenz.<br />
Hab den Buch vorschlag (glaub auch von Werner Salomon) gesehen aber ein ganzes Buch fuer das ist mir eigenlich zu viel.</p>
<p>Gruessle stuxn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269319</guid><dc:creator><![CDATA[stuxn]]></dc:creator><pubDate>Fri, 09 Nov 2012 14:28:41 GMT</pubDate></item><item><title><![CDATA[Reply to stream manipulator fuer colored console output on Fri, 09 Nov 2012 15:11:59 GMT]]></title><description><![CDATA[<p>Ja, wenn du jedes Zeichen das Ausgegeben wird, prüfen willst, musst du einen eigenen Stream Buffer schreiben.</p>
<p>Hier mal meine Version mit der WinAPI <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="🤡"
    /> <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>
<pre><code>#include &lt;iostream&gt;
#include &lt;windows.h&gt;

enum COLOR
{
        black,
        blue,
        green,
        cyan,
        red,
        magenta,
        brown,
        light_grey,
        dark_grey,
        light_blue,
        light_green,
        light_cyan,
        light_red,
        light_magenta,
        yellow,
        white,
        default_text_color = white,
        default_background_color = black
};

struct color_manipulator
{
        color_manipulator(int c):
                color_code(c) {}

        int color_code;
};

color_manipulator color(COLOR text_color, COLOR background_color = COLOR::black)
{
        return text_color + 16 * background_color;
}

std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, color_manipulator c)
{
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c.color_code);
        return os;
}

class color_resetter : public std::streambuf
{
        std::streambuf* mTarget;

protected:

        virtual int_type overflow(traits_type::int_type m = traits_type::eof())
        {
                if(traits_type::eq(m, '\n')) //Muss hier vorher noch ein Vergleich zu eof mit eq_int_type rein?
                        std::cout &lt;&lt; color(default_text_color, default_background_color);

                return mTarget-&gt;sputc(m);
        }

public:

        color_resetter(std::streambuf *target):
                mTarget(target) {}
};

int main()
{
        color_resetter resetter(std::cout.rdbuf());
        std::streambuf* old_streambuf = std::cout.rdbuf(&amp;resetter);

        /// *** DEIN BEISPIEL *** 
        std::cout &lt;&lt; &quot;[timestamp] - &quot; &lt;&lt; color(red) &lt;&lt; &quot;error&quot; &lt;&lt; color(white) &lt;&lt; &quot;[text]&quot; &lt;&lt; &quot;\n&quot;;
        //oder
        std::cout &lt;&lt; &quot;connected to: &quot; &lt;&lt; color(green) &lt;&lt; &quot;[ip]&quot; &lt;&lt; &quot;\n&quot;;
        std::cout &lt;&lt; &quot;normal text\n&quot;;

        std::cout &lt;&lt; color(black, white) &lt;&lt; &quot;text with different background/font&quot; &lt;&lt; &quot;\n&quot;;

        std::cout.rdbuf(old_streambuf);
}
</code></pre>
<p>Aber da müsste nochmal Werner oder so drüberschaun', bin sicher ich hab' ein Paar Fehler gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269336</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 09 Nov 2012 15:11:59 GMT</pubDate></item><item><title><![CDATA[Reply to stream manipulator fuer colored console output on Fri, 09 Nov 2012 16:09:17 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Ja, wenn du jedes Zeichen das Ausgegeben wird, prüfen willst, musst du einen eigenen Stream Buffer schreiben.</p>
<p>Hier mal meine Version mit der WinAPI <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="🤡"
    /> <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>
<pre><code>...
</code></pre>
<p>Aber da müsste nochmal Werner oder so drüberschaun', bin sicher ich hab' ein Paar Fehler gemacht.</p>
</blockquote>
<p>Perfekt, genau das was ich auch machen wollt. Ich hab jetzt nur noch die color_resetter Klasse angepasst. Imho macht das mehr Sinn:</p>
<pre><code class="language-cpp">class color_resetter : public std::streambuf
{        
public:
	static const char RESET_TOKEN = '\n';

	color_resetter(std::ostream&amp; stream):
		m_target( stream.rdbuf() ), m_stream( stream)
	{
		stream.rdbuf( this );
	}	
	~color_resetter() {
		m_stream.rdbuf( m_target );
	}
protected:

    virtual int_type overflow(traits_type::int_type m = traits_type::eof())
    {
            if(traits_type::eq(m, RESET_TOKEN)) //Muss hier vorher noch ein Vergleich zu eof mit eq_int_type rein?
                    std::cout &lt;&lt; color(default_text_color, default_background_color);

            return m_target-&gt;sputc(m);
    }

private:
	std::ostream&amp; m_stream;
	std::streambuf* m_target;
};
</code></pre>
<p>Somit kann man statt:</p>
<pre><code class="language-cpp">int main()
{
        color_resetter resetter(std::cout.rdbuf());
        std::streambuf* old_streambuf = std::cout.rdbuf(&amp;resetter);

        /** ausgabe **/

        std::cout.rdbuf(old_streambuf);
}
</code></pre>
<p>einfach:</p>
<pre><code class="language-cpp">int main()
{
        color_resetter resetter(std::cout);
 /**ausgabe**/

}
</code></pre>
<p>schreiben.</p>
<p>Danke vielmals Sone.</p>
<p>Gruessle stuxn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269353</guid><dc:creator><![CDATA[stuxn]]></dc:creator><pubDate>Fri, 09 Nov 2012 16:09:17 GMT</pubDate></item></channel></rss>