<?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[Eigener cout Befehl]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich würde gerne meine eigene Output Funktion schreiben.</p>
<p>Die bei dem Aufruf funkt(&lt;wie auch immer formatierter Output&gt;)<br />
den Output: &quot;Task &lt;nr&gt;: &lt;wie auch immer formatierter Output&gt;&quot;<br />
Ausgibt.</p>
<pre><code>void myPrintf( const char * format, ... )
{
#ifdef PARALLEL
  printf( &quot;Task %03d: &quot;, ThisTask.number );
#endif
  va_list args;
  va_start( args, format );
  vprintf( format, args );
  va_end( args );
}
</code></pre>
<p>Es wäre nur schön das ganze nun für cont zu Erzeugen.<br />
So dass man den &lt;&lt; Operator nutzen und weiterhin überladen kann.<br />
um zum Beispiel auch eigene Formate wie komplexe Zahlen oder Datum etc. Formatiert ausgeben kann.<br />
Also dass ich weiterhin:</p>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp; Stream, complex&amp; Z)
{
    return Stream &lt;&lt; Z.real &lt;&lt; '+i' &lt;&lt; Z.imag;
}
</code></pre>
<p>mit meinem neuen Output:</p>
<pre><code>MYIO::cout&lt;&lt; Z &lt;&lt; &quot;beliebiger string&quot; &lt;&lt; &lt;anderer Datentyp&gt; &lt;&lt; std::end
</code></pre>
<p>verwenden kann.</p>
<p>wenn die Funktion dann auch noch am Ende auch noch selbstständig einen Zeilenumbruch macht, wäre das natürlich auch schön.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/335176/eigener-cout-befehl</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Apr 2026 19:36:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/335176.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Nov 2015 23:48:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eigener cout Befehl on Tue, 03 Nov 2015 23:48:31 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich würde gerne meine eigene Output Funktion schreiben.</p>
<p>Die bei dem Aufruf funkt(&lt;wie auch immer formatierter Output&gt;)<br />
den Output: &quot;Task &lt;nr&gt;: &lt;wie auch immer formatierter Output&gt;&quot;<br />
Ausgibt.</p>
<pre><code>void myPrintf( const char * format, ... )
{
#ifdef PARALLEL
  printf( &quot;Task %03d: &quot;, ThisTask.number );
#endif
  va_list args;
  va_start( args, format );
  vprintf( format, args );
  va_end( args );
}
</code></pre>
<p>Es wäre nur schön das ganze nun für cont zu Erzeugen.<br />
So dass man den &lt;&lt; Operator nutzen und weiterhin überladen kann.<br />
um zum Beispiel auch eigene Formate wie komplexe Zahlen oder Datum etc. Formatiert ausgeben kann.<br />
Also dass ich weiterhin:</p>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp; Stream, complex&amp; Z)
{
    return Stream &lt;&lt; Z.real &lt;&lt; '+i' &lt;&lt; Z.imag;
}
</code></pre>
<p>mit meinem neuen Output:</p>
<pre><code>MYIO::cout&lt;&lt; Z &lt;&lt; &quot;beliebiger string&quot; &lt;&lt; &lt;anderer Datentyp&gt; &lt;&lt; std::end
</code></pre>
<p>verwenden kann.</p>
<p>wenn die Funktion dann auch noch am Ende auch noch selbstständig einen Zeilenumbruch macht, wäre das natürlich auch schön.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474070</guid><dc:creator><![CDATA[optus]]></dc:creator><pubDate>Tue, 03 Nov 2015 23:48:31 GMT</pubDate></item><item><title><![CDATA[Reply to Eigener cout Befehl on Wed, 04 Nov 2015 00:34:12 GMT]]></title><description><![CDATA[<p>Da gibt's sicher viele Möglichkeiten, ich würde da mal spontan meinen alten Musterstreambuf reaktivieren und in dessen Overflowfunktion die Lognachricht ausgeben:</p>
<pre><code>#include &lt;streambuf&gt;
#include &lt;ios&gt;    
#include &lt;thread&gt;
#include &lt;sstream&gt;

class seppjs_thread_logger_streambuf : public std::streambuf
{
public:
  seppjs_thread_logger_streambuf(std::ios&amp; in) : in(in), buf (in.rdbuf()), newline(true)
  {
    in.rdbuf(this);
  }
  ~seppjs_thread_logger_streambuf()
  {
    in.rdbuf(buf);
  }
  seppjs_thread_logger_streambuf(const seppjs_thread_logger_streambuf&amp;) = delete;
  seppjs_thread_logger_streambuf&amp; operator=(const seppjs_thread_logger_streambuf&amp;) = delete;

private:
  std::ios&amp; in;
  std::streambuf* buf;
  bool newline;

protected:
  virtual int_type overflow(int_type c)
  {
    if(newline)
      {
        std::stringstream message;
        message &lt;&lt; &quot;Task &quot; &lt;&lt; std::this_thread::get_id() &lt;&lt; &quot;: &quot;;
        buf-&gt;sputn(message.str().data(), message.str().size());
        newline = false;
      }
    if (traits_type::eq_int_type(c, traits_type::to_int_type('\n')))
      newline = true;
    buf-&gt;sputc(c);
    return c;  
  }
};

// Beispielanwendung
#include &lt;iostream&gt;

void function()
{
  std::cout &lt;&lt; &quot;Blah\nBlupp\nBäh\n&quot;;  
}

int main()
{
  seppjs_thread_logger_streambuf foo(std::cout);
  std::thread t1(function), t2(function);

  t1.join();
  t2.join();
}
</code></pre>
<p>edit: ideone-Link: <a href="http://ideone.com/i6YeBH" rel="nofollow">http://ideone.com/i6YeBH</a></p>
<p>Dazu sei noch angemerkt, dass printf auf manchen Systemen (mindestens solchen mit glibc) garantiert threadsicher ist. Ausgaben über std::cout aber nicht<sup>*</sup>! Dies ist daher auch eine gute Gelegenheit, noch einen Mutex vor die Ausgabe zu schalten. Das überlasse ich aber dem geneigten Leser zur Übung.</p>
<p><sup>*</sup>: In dem Sinne, dass Streamausgabefunktionen zwar reentrant sind, aber dass gleichzeitige Ausgaben dann eventuell wild miteinander verquirlt werden. Bei printf ist bei der glibc hingegen garantiert, dass ein printf komplett abgearbeitet wird, bevor das nächste dran kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474072</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 04 Nov 2015 00:34:12 GMT</pubDate></item></channel></rss>