Simultan in cout und file schreiben?
-
Also scheint es der streambuf zu werden. (Oh du steile c++ Lernkurve
)Kann mir wer beim Verstehen des Codes auf die Sprünge helfen?
Ich find keine Erklärung für das struct ComposeBuffer das sich von streambuf ableitet. Ein struct als Klasse?
-
ComposeBuffer ist eine struct, die innerhalb der class ComposeStream definiert wird. Da das im private Bereich passiert, können nur ComposeStream-Objekte oder dessen friends auf ComposeBuffer zugreifen, für alles andere ist diese struct nicht zugänglich.
ComposeBuffer ist der streambuf, der ComposeStream verwendet.
Es wird die Funktion overflow überschrieben. Diese wird aufgerufen, wenn der interne Buffer voller Zeichen ist, und soll sie auf das entsprechende Ausgabemedium ausgeben. Das Ausgabemedium ist in diesem Fall ein vector von anderen streambufs. Für jeden streambuf darin wird in der for_each Zeile die Memberfunktion sputc aufgerufen, die das übergebene Zeichen in den internen Buffer von diesem streambuf schreibt. Ist der voll, wird wiederum overflow von diesem streambuf aufgerufen, der das Zeichen dann schlussendlich auf die Konsole/Datei/whatever schreibt.
Der ComposeStream bietet lediglich komfortablen Zugriff um bequemes Hinzufügen/Entfernen von streams zu ermöglichen, diese werden dann in den vector des ComposeBuffers eingefügt.
-
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.