<?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::ostringstream flushen nachdem was reingeschrieben wurde]]></title><description><![CDATA[<p>Servus,</p>
<p>ich habe hier eine kleine Logger-Klasse, die ein Singleton implementiert und eine statische Methode hat, um einen std::string loggen zu können. Diesem String wird ein Timestamp vorangesetzt und er wird dann sowohl auf der Konsole als auch in eine Datei ausgegeben.</p>
<p>Soweit, so gut, nun würde ich aber gerne kompliziertere Ausdrücke loggen können und zwar so komfortabel wie ein std::cout.</p>
<p>Dazu habe ich einen std::ostringstream definiert.<br />
Mein Logger hat jetzt eine statische Methode</p>
<pre><code class="language-cpp">static std::ostringstream&amp; logstream() { return getLogger()-&gt;m_stringstream;}
</code></pre>
<p>Was ich jetzt bräuchte wäre eine möglichkeit, ein schreiben in diesen Stream zu bemerken und danach direkt die Methode log(std::string) aufzurufen.</p>
<p>Bisher mache ich es so, dass ich einem Aufruf</p>
<pre><code class="language-cpp">Logger::logstream &lt;&lt; &quot;Das ist der &quot; &lt;&lt; i &lt;&lt; &quot;.te Logeintrag&quot;;
</code></pre>
<p>ein</p>
<pre><code class="language-cpp">Logger::flush()
</code></pre>
<p>nachschalte, wobei flush einfach</p>
<pre><code class="language-cpp">getLogger()-&gt;log(getLogger-&gt;m_stringstream.str());
</code></pre>
<p>macht, gefolgt von einer Neuinitialisierung des stringstream mit str(&quot;&quot;).</p>
<p>Das ist aber zeimlich unhandlich.<br />
Die auf der Hand liegende Methode wäre, vor dem return m_stringstream jeweils ein flush() aufzurufen und das letzte flush() im singleton-destruktor.</p>
<p>Dann stimmen aber meine Timestamps nicht mehr mit dem tatsächlichen Logeintrag überein, was an manchen Stellen entscheidend ist.</p>
<p>Geht das eleganter?<br />
Etwa über ein callback, was aufgerufen wird, wenn der stringstream manipuliert wurde?</p>
<p>Danke für Ideen!<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/240502/std-ostringstream-flushen-nachdem-was-reingeschrieben-wurde</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 00:03:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/240502.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 07 May 2009 11:43:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::ostringstream flushen nachdem was reingeschrieben wurde on Thu, 07 May 2009 11:43:26 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich habe hier eine kleine Logger-Klasse, die ein Singleton implementiert und eine statische Methode hat, um einen std::string loggen zu können. Diesem String wird ein Timestamp vorangesetzt und er wird dann sowohl auf der Konsole als auch in eine Datei ausgegeben.</p>
<p>Soweit, so gut, nun würde ich aber gerne kompliziertere Ausdrücke loggen können und zwar so komfortabel wie ein std::cout.</p>
<p>Dazu habe ich einen std::ostringstream definiert.<br />
Mein Logger hat jetzt eine statische Methode</p>
<pre><code class="language-cpp">static std::ostringstream&amp; logstream() { return getLogger()-&gt;m_stringstream;}
</code></pre>
<p>Was ich jetzt bräuchte wäre eine möglichkeit, ein schreiben in diesen Stream zu bemerken und danach direkt die Methode log(std::string) aufzurufen.</p>
<p>Bisher mache ich es so, dass ich einem Aufruf</p>
<pre><code class="language-cpp">Logger::logstream &lt;&lt; &quot;Das ist der &quot; &lt;&lt; i &lt;&lt; &quot;.te Logeintrag&quot;;
</code></pre>
<p>ein</p>
<pre><code class="language-cpp">Logger::flush()
</code></pre>
<p>nachschalte, wobei flush einfach</p>
<pre><code class="language-cpp">getLogger()-&gt;log(getLogger-&gt;m_stringstream.str());
</code></pre>
<p>macht, gefolgt von einer Neuinitialisierung des stringstream mit str(&quot;&quot;).</p>
<p>Das ist aber zeimlich unhandlich.<br />
Die auf der Hand liegende Methode wäre, vor dem return m_stringstream jeweils ein flush() aufzurufen und das letzte flush() im singleton-destruktor.</p>
<p>Dann stimmen aber meine Timestamps nicht mehr mit dem tatsächlichen Logeintrag überein, was an manchen Stellen entscheidend ist.</p>
<p>Geht das eleganter?<br />
Etwa über ein callback, was aufgerufen wird, wenn der stringstream manipuliert wurde?</p>
<p>Danke für Ideen!<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1707069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707069</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Thu, 07 May 2009 11:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to std::ostringstream flushen nachdem was reingeschrieben wurde on Thu, 07 May 2009 12:24:36 GMT]]></title><description><![CDATA[<p>Du könntest den stringstream kapseln.</p>
<pre><code class="language-cpp">class mysstringstream
{
    stringstream str;

public:
    op&lt;&lt;(..) { str &lt;&lt; ..; flush(); }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1707096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707096</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 07 May 2009 12:24:36 GMT</pubDate></item><item><title><![CDATA[Reply to std::ostringstream flushen nachdem was reingeschrieben wurde on Thu, 07 May 2009 12:44:59 GMT]]></title><description><![CDATA[<p>dann muss ich aber für jeden Dreckstyp, den ich unterstützen möchte, den &lt;&lt;-operator neu schreiben.</p>
<p>Ich merke gerade, flush ist wohl nicht der richtige Name für diese Methode. Es geht NICHT um die iostream methode flush, sondern um das, was ich oben definiert habe:<br />
getLogger()-&gt;log(getLogger-&gt;m_stringstream.str());</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1707115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707115</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Thu, 07 May 2009 12:44:59 GMT</pubDate></item></channel></rss>