Simultan in cout und file schreiben?



  • Use Boost!

    #include <iostream>
    #include <fstream>
    #include <boost/iostreams/tee.hpp>
    #include <boost/iostreams/stream.hpp>
    
    namespace io = boost::iostreams;
    
    int main()
    {
      typedef io::tee_device<std::ostream, std::ofstream> tee_device;
      std::ofstream ofs("log.txt");
      std::ostream cout_copy(std::cout.rdbuf());
      TeeDevice tee_device(cout_copy, ofs); 
      io::stream<tee_device> split(tee);
      std::cout.rdbuf(split.rdbuf());
    
      std::cout << "Hello, World!\n"; // schreib nach cout und nach log.txt
    }
    


  • Zu boost/iostreams/tee hab ich keine brauchbare Doku gefunden.
    Sonst hätte ich mir das schon überlegt.



  • alex1974 schrieb:

    Zu boost/iostreams/tee hab ich keine brauchbare Doku gefunden.
    Sonst hätte ich mir das schon überlegt.

    lawl.

    http://www.boost.org/doc/libs/
    http://en.cppreference.com/w/



  • alex1974 schrieb:

    Ich will eine Logger Klasse schreiben und wundere mich gerade, das es in C++ scheinbar nicht einfach ist die Ausgabe gleichzeitig auf den Bildschirm und/oder in eine Datei zu leiten.

    Kann mich jemand auf den richtigen Weg führen?

    Edit: Google hilft teilweise.
    Es geht wohl über den streambuf, dessen overflow und sync modifiziert werden.

    Im Prinzip ja - guckst Du hier.
    Die Weiche rufst Du auf, sobald klar ist, wo die Logging-Ausgabe hin gehen soll.

    Gruß
    Werner



  • alex1974 schrieb:

    Ich will eine Logger Klasse schreiben und wundere mich gerade, das es in C++ scheinbar nicht einfach ist die Ausgabe gleichzeitig auf den Bildschirm und/oder in eine Datei zu leiten.

    Komisch, den Wunsch verspürte ich nie, obwohl er oft angefragt wird. Wenn ich in eine Datei logge, kann ich die doch in einem anderen Fenster bequem mitlesen, egal ob Windows oder Linux.



  • Ich hab' das für unsere Build-Skripte mit nem in Javascript (cscript.exe) implementierten Standard-Out-Tee gelöst.



  • volkard schrieb:

    Komisch, den Wunsch verspürte ich nie, obwohl er oft angefragt wird. Wenn ich in eine Datei logge, kann ich die doch in einem anderen Fenster bequem mitlesen, egal ob Windows oder Linux.

    Wie macht man das denn am besten? Geht das auch intelligenter als jede Sekunde "tail log" zu schreiben?



  • qwas schrieb:

    Wie macht man das denn am besten? Geht das auch intelligenter als jede Sekunde "tail log" zu schreiben?

    Mit tail -f log?



  • [quote="nman"]

    qwas schrieb:

    Mit tail -f log?

    Ah danke - nun kommen mir meine "tail log"-Orgien rückblickend recht blöd vor.



  • qwas schrieb:

    Ah danke - nun kommen mir meine "tail log"-Orgien rückblickend recht blöd vor.

    Falls du mehrere Files zu überwachen hast, kannst du auch multitail verwenden; auch ein sehr praktisches Tool.



  • qwas schrieb:

    Wie macht man das denn am besten? Geht das auch intelligenter als jede Sekunde "tail log" zu schreiben?

    watch -n 1 -d tail log
    wäre auch noch spaßig.


Anmelden zum Antworten