c++ Dateilogger



  • 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