Unterschiede zwischen std :: endl und '\ n' für Streambuffer-Implementierungen
-
27-10-2019 - |
Frage
Ich versuche derzeit, eine Unterklasse von stringbuf zu implementieren, damit der Puffer für bestimmte Zeichen tokenisieren kann (in meinem Fall '\ n') und eine Aktion ausführen kann, wenn dieses Zeichen auftritt (die Nachricht an einen Logger ausgeben und den Puffer löschen danach in meinem Fall). Um dieses Ziel zu erreichen, habe ich sputc (um das Beobachten des '\ n' zu implementieren) und xsputn (um sputc tatsächlich zu verwenden, überschrieben, da die GCC-Implementierung dies nicht standardmäßig zu tun scheint) überschrieben. Zu Debugging-Zwecken lasse ich sputc jedes Zeichen aufschreiben, das an stdout übergeben wird.
Nun ist dies meine Frage: Wenn ich so etwas wie verwende
mystream << "Some text" << std::endl;
sputc empfängt jedes Zeichen mit Ausnahme des '\ n', das von std :: endl induziert werden soll, sodass die erwartete Aktion nicht ausgeführt wird, da das '\ n' nicht weitergegeben wird. Wenn ich so etwas wie benutze
mystream << "Some text" << '\n';
oder sogar
mystream << "Some text" << "\n" << std::flush;
Alles funktioniert wie erwartet und meine Sputc-Implementierung erhält das Zeichen '\ n'.
Meine Frage lautet also: Sollten nicht beide Codezeilen in Bezug auf den dahinter liegenden Stringbuf genau dasselbe tun, und wenn nicht, welche anderen Methoden muss ich überschreiben, um das '\ n' zu erhalten?
Lösung
Sie können sputc
nicht überschreiben, da sputc
nicht virtuell ist.Sie müssen overflow
und sync
überladen und die gesamte ausstehende Sequenz auf das Auftreten von \n
untersuchen.
Sie sollten xsputn
nicht wirklich überladen müssen, es sei denn, Sie können etwas Optimales tun, da Sie etwas Besonderes über das Gerät wissen, das Ihren Stream-Typ unterstützt.