c++ Dateilogger



  • Du kannst den Streams per Operator-Kette mehrere Werte übergeben (in der Form "out<<data1<<data2<<..."). Eventuell könntest du dich auch mal unter Boost::Format umsehen, wenn du printf()-ähnliche Formatierungen mit Streams kombinieren willst.

    edit @1310: Klar gibt es in C++ noch variable Parameterlisten - schon aus Gründen der Kompatibilität.



  • CStoll schrieb:

    edit @1310: Klar gibt es in C++ noch variable Parameterlisten - schon aus Gründen der Kompatibilität.

    Hm ok. Aber die sollte man doch nicht mehr verwenden, da veraltet oder?



  • #define DBG(expr) \
      do { if (debug_enabled) logfile << expr; } while (false)
    

    wobei "logfile" als "std::ofstream" und "log_enabled" als "bool" definiert ist. Dann kannst Du so etwas schreiben:

    int a = 5;
    DBG("Der Wert für Variable a ist " << 5);
    

    Ich habe mir eine Meta-logging-Library um soetwas gestrickt. Wenn Du Interesse hast, sag Bescheid.

    Tntnet



  • Ok, das mit der Verkettung durch den << Operator habe ich begriffen. Meine eigentliche Frage bezieht sich dann auf die Ausgabe der Daten, soll heissen ich will immer automatisch den Zeitstempel voranstehend haben ohne das ich das explizit angeben muss. Alles weitere kann variabel sein und sollte nach Aufruf der Funktion auf einer Zeile stehen. Da ich nu eher aus der C Welt komme bin ich mir nicht sicher wie ich das in C++ implementieren muss. Muss ich den << Operator dazu mit Hilfe einer eigenen Debugklasse überladen, wenn ja wie? Sind trotzdem explizite Zeilenumbrüche mit endl möglich?

    Vielen Dank schon mal



  • ups.. da war ich wohl zu langsam ;-).
    @tntnet:
    ich denke dein Beispiel reicht, wenn ich da auch mehrere Werte verknüpfen kann, Danke. Um dein Beispiel zu Verwenden:

    DBG("Der Wert für Variable a ist " << 5 << " B ist " << 6);
    

    würde das damit gehn?



  • Ok, vielen Dank an Alle, das Beispiel von tntnet war im Prinzip genau das was ich gesucht habe. Hier nochmal ein komplettes Beispiel als Pendant zur C Implementierung:

    #include <iostream>
    #include <fstream>
    #include <time.h>
    
    bool debug_enabled = true;
    std::ofstream logfile;
    
    #define DBG(expr) \
      do { if (debug_enabled) logfile << time(NULL) << ": " << expr << std::endl; } while (false) 	
    
    int main()
    {
    	logfile.open("ausgabe.txt");
    	if(!logfile) {
    		std::cout << "open logfile failed" << std::endl;
    		return -1;
    	}
    
    	DBG("Der Wert für Variable a ist " << 5 << " B ist " << 6);
    
    	logfile.close();
    
    	return 0;
    }
    

    Gruß, Kekso



  • Darf ich fragen, wozu die Schleife mit der Bedingung while(false) nötig ist? Sie wird ja eh nur einmal ausgeführt, dann kann man sie ja auch weglassen, oder?

    Man lernt ja nie aus 😃



  • Ja, das wird benötigt, damit du die Anweisung auch in geschachtelten if()- und Schleifen-Strukturen einsetzen kannst, ohne deinen Programmfluß durcheinanderzubringen (der Präprozessor ersetzt blind - also würde er das else zu dem if(debug_enables) zuordnen:)

    if(mymap.find(val)!=mymap.end())
      DBG("Wert gefunden");
    else
      DBG("nichts gefunden");
    


  • Was müsste ich den eigentlich tun damit dieses Makro auch über eine Funktion abbildbar ist?

    void debugMsg([Datentyp???] expr){
    	if (debug_enabled) 
    		logfile << time(NULL) << ": " << expr << std::endl; 	
    }
    

    Kekso



  • Okay danke, wieder was gelernt ^^



  • @kekso
    Mach ein template draus.

    template<typename T>
    void debugMsg(const T& expr){
        if (debug_enabled)
            logfile << time(NULL) << ": " << expr << std::endl;    
    }
    


  • ok, aber das funktioniert nur für einen Parameter. Bei einer Liste wie

    debugMsg("Der Wert für Variable a ist " << 5 << " B ist " << 6);
    

    aber leider nicht.



  • Bei dem Makro so direkt aber auch nicht, es sei denn man verwendet derartige Makroargumente

    DBG(a << b << c)
    

    Du könntest dir pro Anzahl der Parameter eine neue Funktion überladen.



  • 🙂 ok das wäre möglich, aber nicht wirklich praktikabel. Aber trotzdem Danke


Anmelden zum Antworten