<?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[Eigene Log-Klasse erstellen, mit Stringstream]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich bin gerade Dabei mir eine Log-Klasse zu erstellen, dazu hätte ich ein paar Fragen ...</p>
<p>Hier erstmal das, was ich schon hab:</p>
<p>log.h</p>
<pre><code class="language-cpp">#ifndef _log_h_
#define _log_h_

#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;

class CLog {
    public:
        std::stringstream &amp;data;
        std::ostream &amp;os;

        #ifdef NDEBUG
            std::ofstream &amp;of;
            std::string file;
        #endif

    public:
        CLog();
        #ifndef NDEBUG
            CLog(std::stringstream &amp;data, std::ostream &amp;os = std::cout);
        #else
            CLog(std::string &amp;file = &quot;log.log&quot;);
            CLog(std::stringstream &amp;data, std::string &amp;file = &quot;log.log&quot;);
        #endif
        CLog(const CLog &amp;log);
        virtual ~CLog();

    public:
        CLog operator=(const CLog &amp;log);
        void operator&lt;&lt;(const CLog &amp;log);
        #ifndef NDEBUG
            friend std::ostream&amp; operator&lt;&lt;(std::ostream &amp;os, CLog &amp;log);
        #else
            friend void operator&lt;&lt;(std::ofstream &amp;of, CLog &amp;log);
        #endif
        template&lt;typename LOG&gt; void operator&lt;&lt;(LOG log);
        friend CLog operator&lt;&lt;(CLog log, int buff);
        friend CLog operator&lt;&lt;(CLog log, std::string buff);
};

#endif //_log_h_
</code></pre>
<p>log.cpp</p>
<pre><code class="language-cpp">#include &quot;log.h&quot;

using namespace std;

//Konstruktoren
    #ifndef NDEBUG
        CLog::CLog() : os(cout), data(){
        }

    #else
        CLog::CLog() : os(cout), data(), of(){
            #ifdef NDEBUG
                this-&gt;file = &quot;log.log&quot;;
                ofstream of;
                of.open(this-&gt;file.c_str());
                of.close();
            #endif
        }
    #endif

    #ifndef NDEBUG
        CLog::CLog(stringstream &amp;data, ostream &amp;os) : data(data), os(os){
        }
    #else
        CLog::CLog(string &amp;file) : of(), data(), os(cout), file(file){
            ofstream of;
            of.open(this-&gt;file.c_str());
            of.close();
        }

        CLog::CLog(stringstream &amp;data, string &amp;file) : of(), data(data), os(cout), file(file){
            ofstream of;
            of.open(this-&gt;file.c_str());
            of.close();
        }
    #endif

    #ifndef NDEBUG
        CLog::CLog(const CLog &amp;log) : os(cout), data(){
            stringstream ss;
            ss.str(&quot;&quot;);
            ss.clear();
            ss&lt;&lt;log.data.str();
        }
    #else
        CLog::CLog(const CLog &amp;log) : os(cout), data(), of(){
            this-&gt;data.str(&quot;&quot;);
            this-&gt;data.clear();
            this-&gt;data&lt;&lt;log.data;
        }
    #endif

//Destruktor
    CLog::~CLog(){
    }

//Operatoren
    CLog CLog::operator=(const CLog &amp;log){
        this-&gt;data.str(&quot;&quot;);
        this-&gt;data.clear();
        this-&gt;data&lt;&lt;log.data;
        return *this;
    }

    void CLog::operator&lt;&lt;(const CLog &amp;log){
        this-&gt;data.str(&quot;&quot;);
        this-&gt;data.clear();
        this-&gt;data&lt;&lt;log.data;
        #ifndef NDEBUG
            this-&gt;os&lt;&lt;*this;
        #else
            this-&gt;of&lt;&lt;*this;
        #endif
    }

    #ifndef NDEBUG
        ostream&amp; operator&lt;&lt;(std::ostream &amp;os, CLog &amp;log){
            return os&lt;&lt;log.data.str().c_str();
        }
    #else
        void operator&lt;&lt;(std::ofstream &amp;of, CLog &amp;log){
            of.open((log.file.str()).c_str(), ios::out|ios::app);
            if(of.good()){
                of&lt;&lt;log.data.c_str();
                of.close();
            }
            else cout&lt;&lt;log.data.str();
        }
    #endif

    template&lt;typename LOG&gt; void CLog::operator&lt;&lt;(LOG log){
        this-&gt;data&lt;&lt;log;
        #ifndef NDEBUG
            this-&gt;os&lt;&lt;*this;
        #else
            this-&gt;of&lt;&lt;*this;
        #endif
        this-&gt;data.str(&quot;&quot;);
        this-&gt;data.clear();
    }

    CLog operator&lt;&lt;(CLog log, int buff){
        log.data&lt;&lt;buff;
        #ifndef NDEBUG
            log.os&lt;&lt;log.data;
        #else
            log.of&lt;&lt;log.data;
        #endif
        log.data.str(&quot;&quot;);
        log.data.clear();
    }

    CLog operator&lt;&lt;(CLog log, string buff){
        log.data&lt;&lt;buff;
        #ifndef NDEBUG
            log.os&lt;&lt;log.data;
        #else
            log.of&lt;&lt;log.data;
        #endif
        log.data.str(&quot;&quot;);
        log.data.clear();
    }
</code></pre>
<p>Hier gleich mal mehrere Fragen:<br />
1. Ist das so in Ordnung mit dem</p>
<pre><code class="language-cpp">#ifndef NDEBUG
</code></pre>
<p>oder sollte ich es lieber anders machen?<br />
2. Sollte ich statt Stringstream etwas anderes nehmen?<br />
3. Wenn ich Daten in den Stringstream schreiben will (log.cpp Zeile 43, 49...), Beendet immer mein Programm, ohne Fehler oder Sonstiges<br />
4. Kann ich dann einfach in anderen Klassen einen friend Operator für die Log-Klasse deklarieren?</p>
<pre><code class="language-cpp">class foo {
foo();
...
friend CLog&amp; operator&lt;&lt;(CLog &amp;log, foo &amp;foo_obj);
...
};
</code></pre>
<p>Für Anregungen stehe ich gerne zur Verfügung</p>
<p>Gruß<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/247056/eigene-log-klasse-erstellen-mit-stringstream</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 18:23:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247056.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Aug 2009 12:50:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eigene Log-Klasse erstellen, mit Stringstream on Wed, 05 Aug 2009 12:50:25 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich bin gerade Dabei mir eine Log-Klasse zu erstellen, dazu hätte ich ein paar Fragen ...</p>
<p>Hier erstmal das, was ich schon hab:</p>
<p>log.h</p>
<pre><code class="language-cpp">#ifndef _log_h_
#define _log_h_

#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;

class CLog {
    public:
        std::stringstream &amp;data;
        std::ostream &amp;os;

        #ifdef NDEBUG
            std::ofstream &amp;of;
            std::string file;
        #endif

    public:
        CLog();
        #ifndef NDEBUG
            CLog(std::stringstream &amp;data, std::ostream &amp;os = std::cout);
        #else
            CLog(std::string &amp;file = &quot;log.log&quot;);
            CLog(std::stringstream &amp;data, std::string &amp;file = &quot;log.log&quot;);
        #endif
        CLog(const CLog &amp;log);
        virtual ~CLog();

    public:
        CLog operator=(const CLog &amp;log);
        void operator&lt;&lt;(const CLog &amp;log);
        #ifndef NDEBUG
            friend std::ostream&amp; operator&lt;&lt;(std::ostream &amp;os, CLog &amp;log);
        #else
            friend void operator&lt;&lt;(std::ofstream &amp;of, CLog &amp;log);
        #endif
        template&lt;typename LOG&gt; void operator&lt;&lt;(LOG log);
        friend CLog operator&lt;&lt;(CLog log, int buff);
        friend CLog operator&lt;&lt;(CLog log, std::string buff);
};

#endif //_log_h_
</code></pre>
<p>log.cpp</p>
<pre><code class="language-cpp">#include &quot;log.h&quot;

using namespace std;

//Konstruktoren
    #ifndef NDEBUG
        CLog::CLog() : os(cout), data(){
        }

    #else
        CLog::CLog() : os(cout), data(), of(){
            #ifdef NDEBUG
                this-&gt;file = &quot;log.log&quot;;
                ofstream of;
                of.open(this-&gt;file.c_str());
                of.close();
            #endif
        }
    #endif

    #ifndef NDEBUG
        CLog::CLog(stringstream &amp;data, ostream &amp;os) : data(data), os(os){
        }
    #else
        CLog::CLog(string &amp;file) : of(), data(), os(cout), file(file){
            ofstream of;
            of.open(this-&gt;file.c_str());
            of.close();
        }

        CLog::CLog(stringstream &amp;data, string &amp;file) : of(), data(data), os(cout), file(file){
            ofstream of;
            of.open(this-&gt;file.c_str());
            of.close();
        }
    #endif

    #ifndef NDEBUG
        CLog::CLog(const CLog &amp;log) : os(cout), data(){
            stringstream ss;
            ss.str(&quot;&quot;);
            ss.clear();
            ss&lt;&lt;log.data.str();
        }
    #else
        CLog::CLog(const CLog &amp;log) : os(cout), data(), of(){
            this-&gt;data.str(&quot;&quot;);
            this-&gt;data.clear();
            this-&gt;data&lt;&lt;log.data;
        }
    #endif

//Destruktor
    CLog::~CLog(){
    }

//Operatoren
    CLog CLog::operator=(const CLog &amp;log){
        this-&gt;data.str(&quot;&quot;);
        this-&gt;data.clear();
        this-&gt;data&lt;&lt;log.data;
        return *this;
    }

    void CLog::operator&lt;&lt;(const CLog &amp;log){
        this-&gt;data.str(&quot;&quot;);
        this-&gt;data.clear();
        this-&gt;data&lt;&lt;log.data;
        #ifndef NDEBUG
            this-&gt;os&lt;&lt;*this;
        #else
            this-&gt;of&lt;&lt;*this;
        #endif
    }

    #ifndef NDEBUG
        ostream&amp; operator&lt;&lt;(std::ostream &amp;os, CLog &amp;log){
            return os&lt;&lt;log.data.str().c_str();
        }
    #else
        void operator&lt;&lt;(std::ofstream &amp;of, CLog &amp;log){
            of.open((log.file.str()).c_str(), ios::out|ios::app);
            if(of.good()){
                of&lt;&lt;log.data.c_str();
                of.close();
            }
            else cout&lt;&lt;log.data.str();
        }
    #endif

    template&lt;typename LOG&gt; void CLog::operator&lt;&lt;(LOG log){
        this-&gt;data&lt;&lt;log;
        #ifndef NDEBUG
            this-&gt;os&lt;&lt;*this;
        #else
            this-&gt;of&lt;&lt;*this;
        #endif
        this-&gt;data.str(&quot;&quot;);
        this-&gt;data.clear();
    }

    CLog operator&lt;&lt;(CLog log, int buff){
        log.data&lt;&lt;buff;
        #ifndef NDEBUG
            log.os&lt;&lt;log.data;
        #else
            log.of&lt;&lt;log.data;
        #endif
        log.data.str(&quot;&quot;);
        log.data.clear();
    }

    CLog operator&lt;&lt;(CLog log, string buff){
        log.data&lt;&lt;buff;
        #ifndef NDEBUG
            log.os&lt;&lt;log.data;
        #else
            log.of&lt;&lt;log.data;
        #endif
        log.data.str(&quot;&quot;);
        log.data.clear();
    }
</code></pre>
<p>Hier gleich mal mehrere Fragen:<br />
1. Ist das so in Ordnung mit dem</p>
<pre><code class="language-cpp">#ifndef NDEBUG
</code></pre>
<p>oder sollte ich es lieber anders machen?<br />
2. Sollte ich statt Stringstream etwas anderes nehmen?<br />
3. Wenn ich Daten in den Stringstream schreiben will (log.cpp Zeile 43, 49...), Beendet immer mein Programm, ohne Fehler oder Sonstiges<br />
4. Kann ich dann einfach in anderen Klassen einen friend Operator für die Log-Klasse deklarieren?</p>
<pre><code class="language-cpp">class foo {
foo();
...
friend CLog&amp; operator&lt;&lt;(CLog &amp;log, foo &amp;foo_obj);
...
};
</code></pre>
<p>Für Anregungen stehe ich gerne zur Verfügung</p>
<p>Gruß<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755750</guid><dc:creator><![CDATA[varginator]]></dc:creator><pubDate>Wed, 05 Aug 2009 12:50:25 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Log-Klasse erstellen, mit Stringstream on Wed, 05 Aug 2009 20:24:59 GMT]]></title><description><![CDATA[<p>varginator schrieb:</p>
<blockquote>
<p>Hier gleich mal mehrere Fragen:<br />
1. Ist das so in Ordnung mit dem</p>
<pre><code class="language-cpp">#ifndef NDEBUG
</code></pre>
<p>oder sollte ich es lieber anders machen?</p>
</blockquote>
<p>Im Prinzip ja - aber siehe 2.)</p>
<p>varginator schrieb:</p>
<blockquote>
<p>2. Sollte ich statt Stringstream etwas anderes nehmen?</p>
</blockquote>
<p>Ja - die Erfinder von den C++-Streams haben dafür das Umschalten eines ostreams vorgesehen. Siehe auch den <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-246967.html" rel="nofollow">Parallel-Thread</a>.</p>
<p>varginator schrieb:</p>
<blockquote>
<p>3. Wenn ich Daten in den Stringstream schreiben will (log.cpp Zeile 43, 49...), Beendet immer mein Programm, ohne Fehler oder Sonstiges</p>
</blockquote>
<p>Der member 'data' ist eine Referenz und wird nicht initialisiert; und führt damit zu undefiniertem Verhalten. - bei mir übersetzt das gar nicht!?</p>
<p>varginator schrieb:</p>
<blockquote>
<p>4. Kann ich dann einfach in anderen Klassen einen friend Operator für die Log-Klasse deklarieren?</p>
<pre><code class="language-cpp">class foo {
foo();
...
friend CLog&amp; operator&lt;&lt;(CLog &amp;log, foo &amp;foo_obj);
...
};
</code></pre>
</blockquote>
<p>Ja - aber besser Du deklarierst einen friend-Ausgabe-Operator mit std::ostream&amp; - dafür ist er da. In beiden Fällen sollte es 'const foo&amp; foo_obj' heißen.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755985</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 05 Aug 2009 20:24:59 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Log-Klasse erstellen, mit Stringstream on Thu, 06 Aug 2009 06:41:47 GMT]]></title><description><![CDATA[<p>Hallo Werner,</p>
<p>danke für deine Hilfe, ich hab nur noch ein paar Fragen, wie ich das dann realisieren kann:</p>
<p>zu 1. Ich versteh nich ganz was du damit meinst, wenn ich im Debug-Mode auf cout ausgeben will und im Release auf ostream, dann brauch ich doch defines, oder?</p>
<p>zu 2. Wie würde man das am besten in ner Klasse realisieren?<br />
Kann ich einfach ne streambuf-Variable reinhängen?</p>
<pre><code class="language-cpp">class CLog {
    CLog();

    std::streambuf* old_stream;

    //was muss ich dann beim &lt;&lt;-Operator hinschreiben falls ichs mit dem machen will?
};

//nochmal mit defines
CLog::CLog(){
    #ifndef NDEBUG
        old_stream = clog.rdbuf(cout.rdbuf());
    #else
        std::ofstream logfile(&quot;log.txt&quot;);
        old_stream = clog.rdbuf(logfile.rdbuf());
    #endif
}

int main ( int arg, char* argv[] )
{
    CLog log; // nirgendwo hin

    clog &lt;&lt; &quot;hello world&quot; &lt;&lt; endl;  //oder iwie ne Klassenvariable?

    clog.rdbuf( log.old_stream );
    return 0;
}
</code></pre>
<p>zu 3. Aso, ok, aber ohne Referenz hat ers bei mir nich genommen <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="🙂"
    /></p>
<p>zu 4. Ja, das kann ich schon machen, aber ich will ja im Release den Output in ne Datei<br />
soll ich da dann defines setzen?</p>
<p>Ich will ja den gleichen Aufruf im Debug und im Release, dh. ich gebe</p>
<pre><code class="language-cpp">log&lt;&lt;&quot;Text&quot;&lt;&lt;endl;
</code></pre>
<p>ein, dann soll er im Debug in die Konsole schreiben und im Release in ne Datei</p>
<p>Gruß<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756077</guid><dc:creator><![CDATA[varginator]]></dc:creator><pubDate>Thu, 06 Aug 2009 06:41:47 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Log-Klasse erstellen, mit Stringstream on Thu, 06 Aug 2009 07:44:18 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich hab jetzt die Lösung für mein Problem gefunden:</p>
<p>log.h</p>
<pre><code class="language-cpp">#ifndef _log_h_
#define _log_h_

#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;streambuf&gt;
#include &lt;string&gt;

class CLog {
    public:
        CLog();
        CLog(std::string file);
        ~CLog();

    protected:
        std::streambuf* old_stream;
        #ifdef NDEBUG
            std::ofstream of;
        #endif
};

#endif //_log_h_
</code></pre>
<p>log.cpp</p>
<pre><code class="language-cpp">#include &quot;log.h&quot;

using namespace std;

CLog::CLog(){
    #ifndef NDEBUG
        old_stream = clog.rdbuf();
        clog.rdbuf(cout.rdbuf());
    #else
        of.open(&quot;log.txt&quot;);
        old_stream = clog.rdbuf();
        clog.rdbuf(of.rdbuf());
    #endif
}

CLog::CLog(string file){
    #ifndef NDEBUG
        old_stream = clog.rdbuf();
        clog.rdbuf(cout.rdbuf());
    #else
        of.open(file.c_str());
        old_stream = clog.rdbuf();
        clog.rdbuf(of.rdbuf());
    #endif
}

CLog::~CLog(){
    clog.rdbuf(old_stream);
    #ifdef NDEBUG
        of.close();
    #endif
}
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &quot;log.h&quot;

int main(){
    CLog log();
    clog&lt;&lt;&quot;Hallo Welt&quot;&lt;&lt;endl;
    cin.get();
    return 0;
}
</code></pre>
<p>| EDIT | noch nen Konstruktor hinzugefügt, um die Datei anzugeben</p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756094</guid><dc:creator><![CDATA[varginator]]></dc:creator><pubDate>Thu, 06 Aug 2009 07:44:18 GMT</pubDate></item></channel></rss>