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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top