Simultan in cout und file schreiben?
-
Danke Nathan!
Du bringst kurz und schnell Licht ins Dunkel.Dieses struct Konstrukt hab ich so noch nie gesehen.
-
alex1974 schrieb:
Also scheint es der streambuf zu werden. (Oh du steile c++ Lernkurve
)Du bist zwar nicht der einzige Anfänger, der meint einen Logger zu brauchen, aber du wärst sicherlich der erste, der wirklich einen braucht. Daher: Brauchst du wirklich einen? Falls ja: Wenn dir die anderen Lösungen nicht passen, dann bleibt wohl nur der Streambuf.
Kann mir wer beim Verstehen des Codes auf die Sprünge helfen?
Ich könnte es versuchen, aber:
Ein struct als Klasse?
Vielleicht solltest das ruhen lassen, bis du etwas mehr C++ kannst? Was bringt dir eine Erklärung, die du nicht verstehst? Frag in ein paar Wochen noch einmal nach Streambufs und mach bis dahin weiter Anfängerübungen. Dann lachst du darüber, dass du mal nicht gewusst hast, wie structs und Klassen sich zueinander verhalten und dann hast du auch eine Chance zu verstehen, wie die Streambufs funktionieren. Die Streams sind recht overdesigned, du musst mindestens Vererbung und Polymorphie verstehen, um die Streams zu verstehen und möglichst auch schon einmal selber viel mit den Streams gearbeitet haben, um die Schnittstellen zu kennen. Momentan wärst du damit wahrscheinlich ziemlich überfordert.
-
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.