alle Konsolenausgaben parallel in File speichern?



  • Hi,

    ich hab folgendes Problem. Ich will automatisch alle Konsolenausgaben in ein "Logfile" speichern lassen. Da dies aber unter Linux, Solaris und Windows gehen muss, kann ich nicht per Bash Script arbeiten. Gibt es in C++ diese Möglichkeit? Denn ich habe nicht wirklich Lust, zu allen Konsolenausghaben noch mal ne Fileausgabe hinzuzufügen.

    Gruß



  • Mitgeliefert bekommst du afaik nichts. Aber du könntest dir eine eigene Logged_Buffer Klasse schreiben, die ihre ankommenden Daten parallel in zwei Ausgabekanäle umleitet (z.B. cout und fstream) - den kannst du dann per rdbuf() an cout anhängen:

    class double_buffer : public streambuf
    {
      streambuf& buf1,buf2;
    public:
      double_buffer(streambuf&b1,streambuf&b2) : buf1(b1),buf2(b2) {}
    
      //ohne Garantie:
      virutal int_type overflow(int_type c)
      {
        buf1.sputc(c);
        buf2.sputc(c);
        return c;
      }
    }
    
    int main()
    {
      ofstream logfile("log.txt");
      double_buffer buf(*cout.rdbuf(),*logfile.rdbuf());
      cout.rdbuf(&buf);
      ...
    }
    


  • Ich habe mal einen ostream geschrieben, welcher Ausgaben in 2 Ziele schreiben kann. Du findest die Klasse als cxxtools::Tee in meinen cxxtools. Das funktioniert dann etwa so:

    #include <cxxtools/tee.h>
    ...
    std::ofstream logfile("logfile.log");
    cxxtools::Tee out(logfile, std::cout);
    
    out << "Das landet auf der Konsole und in der Datei" << std::endl;
    

    Die Bibliothek ist zwar für Linux/Unix, aber die Tee-Klasse enthält nichts Systemspezifisches, so daß Du die Dateien tee.cpp und tee.h auch unter anderen Betriebssystemen nutzen kannst.

    Tntnet

    PS: @CStoll: hast gewonnen - Du warst schneller 😡 😋 😃



  • K3il3 schrieb:

    Ich will automatisch alle Konsolenausgaben in ein "Logfile" speichern lassen. Da dies aber unter Linux, Solaris und Windows gehen muss, kann ich nicht per Bash Script arbeiten. Gibt es in C++ diese Möglichkeit?

    Es geht so wie von CStoll bereits skizziert. Mehr zum Thema gibt's auch hier.

    Gruß
    Werner


Anmelden zum Antworten