Drucken mit Ostream

8

Ich möchte Daten ins Nirgendwo schicken, ich meine, dass ich keine Daten in der Konsole oder in einer Datei drucken möchte, aber ich brauche ein std::ostream -Objekt. Wie geht das?

    
scdmb 19.10.2011, 08:15
quelle

5 Antworten

11

Ich habe verwendet:

%Vor%

vor kurzem ohne Probleme, obwohl es als potentiell problematisch markiert wurde, wenn Sie es aus einem bestimmten Blickwinkel betrachtet haben (siehe Link unten).

  

Beiseite: Von dem, was ich verstehe (und ich bin nicht ganz sicher davon), ruft dieser Aufruf schließlich schließlich basic_ios::init(0) auf, und das ist ein Wenn der NULL-Zeiger übergeben wird, wird der Stream-Status, wie er von der Funktion rdstate() zurückgegeben wird, auf den Wert badbit gesetzt.

     

Dies wiederum verhindert, dass der Stream weitere Informationen ausgibt, sondern wirft sie einfach weg.

Das folgende Programm zeigt es in Aktion:

%Vor%

Die Seite, von der ich es bekommen habe hatte dies auch als eine wahrscheinlich sauberere Lösung ( leicht modifiziert, um die Duplizierung meiner ersten Lösung zu entfernen):

%Vor%     
paxdiablo 19.10.2011, 08:17
quelle
5

Die einfachste Lösung besteht darin, nur auf eine ungeöffnete std::ofstream auszugeben. (oder ein anderer Ausgabestream in einem Fehlerzustand). Dies wird dazu führen, dass stream ist permanent in einem Fehlerzustand. Dies könnte ein Vorteil sein ( << Operatoren überspringen die Formatierung), aber wenn Sie einen Code haben kann die Überprüfung auf Fehler nicht kontrollieren und tut etwas Besonderes, wenn sie dies tun auftreten, haben Sie wahrscheinlich Probleme.

Ansonsten ist es ziemlich einfach, einen Null-Stream zu implementieren; das einzige streambuf Funktion, die Sie wirklich überschreiben müssen, ist overflow . Etwas wie das Folgende sollte den Trick tun:

%Vor%

(Der Puffer vermeidet einige unnötige virtuelle Funktionsaufrufe. Bei einigen Plattformen, das macht einen wesentlichen Unterschied.)

Erstellen Sie dann einen Ausgabestream, der es verwendet:

%Vor%

(Die Verwendung von Vererbung statt Containment stellt sicher, dass die streambuf wird vollständig erstellt, bevor es an ostream übergeben wird. Dies ist in der Praxis in der Regel nicht erforderlich, der Standard jedoch nicht scheinen zu autorisieren, eine noch nicht konstruierte streambuf an die Konstruktor von ostream .)

    
James Kanze 19.10.2011 08:43
quelle
2

Einfachste Lösung: Verwenden Sie std::stringstream .

%Vor%

Das stringstream wird die Ausgabe enthalten, aber wenn Sie es nicht verwenden, ist es genauso, als wäre es nie gefüllt.

    
Xeo 19.10.2011 12:40
quelle
0

Einige Vorschläge hier Ссылка

Eine gute Antwort von dieser Seite

Verwenden Sie gewöhnliches std :: fstream, öffnen Sie es nur zum Schreiben in die erforderliche Datei "/ dev / null". Es sollte funktionieren.

Wenn Sie wirklich einen eigenen Stream erstellen möchten, leiten Sie ihn einfach ab basic_ostream und definieren Sie einfach Ihren eigenen Operator & lt; & lt; um funktionieren zu können die nur die Stream-Referenz zurückgibt. Sie müssen Dummy schreiben 'schreiben' und 'put' Methode auch (und alle anderen Methoden für die Ausgabe).

Tatsächlich

%Vor%

Von Ссылка

    
Greg Reynolds 19.10.2011 08:19
quelle
0

Da niemand es erwähnt hat, wenn es um die Unterdrückung von std oder Fehlerausgabe geht, können Sie einfach die entsprechenden Dateideskriptoren schließen (z. B. fclose (stdout) oder fclose (stderr) ).
Das wird alles verscherbeln, einschließlich Dinge wie printf oder fprintf (stderr, ...)
Sie werden also weiterhin die üblichen cout oder cerr verwenden, aber sie werden in Bit-Buckets umgewandelt.

    
kuroi neko 21.04.2017 10:52
quelle

Tags und Links