Sagen Sie kurz: ostringstream
liefert eine streambuf
, ostream
erfordert, dass der Benutzer einen bereitstellt.
Um die Auswirkungen zu verstehen, ist es notwendig, ein wenig zu verstehen
wie Streams funktionieren (und im Gegensatz zu anderen Postern bin ich mir nicht sicher, ob
es gibt eine gute Erkundung davon im Web). Die grundlegende Abstraktion
von ostream
formatiert die Textausgabe. Du gibst es int
oder a
double
(oder ein benutzerdefinierter Typ - mehr dazu später), und es
Konvertiere es in einen Strom von Zeichen vom Typ char
. Was es macht
mit diesem Stream hängt von der streambuf
, die an es hängt;
Dies ist ein Beispiel für das Strategie-Pattern, wobei streambuf
ein ist
abstrakte Basisklasse der Strategie [1]. Der Standard sieht zwei vor
Implementierungen von streambuf
, filebuf
und stringbuf
; in der Praxis,
In allen außer den trivialsten Anwendungen werden Sie wahrscheinlich einige davon haben
Sie implementieren sich selbst.
Bei der Ausgabe verwenden Sie immer ostream
; es ist die Klasse, über die die
<<
Operatoren sind definiert. Sie formatieren Ihre Daten in einem Stream
von Charakteren, und es interessiert dich nicht wirklich, wo der Strom endet.
Beim Erstellen einer Instanz: Wenn Sie eine ostream
erstellen, müssen Sie angeben
es mit einem streambuf
selbst. Meistens erstellen Sie ein
ofstream
oder ostringstream
. Dies sind beide "Komfort" -Klassen,
die von ostream
abgeleitet sind, und ein streambuf
dafür bereitstellen ( filebuf
und stringbuf
, wie es passiert). Praktisch gesprochen sind alle , die sie tun
stelle das notwendige streambuf
zur Verfügung (was den Konstruktor und die
Destruktor, und nicht sehr viel anderes); im Fall von ofstream
, dort
sind auch ein paar zusätzliche Funktionen, die auf zusätzliche Funktionen in weiterleiten
die filebuf
Schnittstelle.
Es ist üblich (aber keineswegs erforderlich), wenn Sie Ihre eigenen definieren
streambuf
, um Convenience - Überladungen von ostream
(und
istream
, falls relevant), in den gleichen Zeilen wie ofstream
oder
ostringstream
.
Aus diesem Grund ist es üblich, wenn Sie eine Instanz erstellen, eine der folgenden Methoden zu verwenden
die "Bequemlichkeit" abgeleitet Klassen, anstatt ostream
direkt zu verwenden
und stellen Sie Ihr eigenes streambuf zur Verfügung.
Und wenn das alles kompliziert erscheint: Die Iostream-Klassen benutzen nur
über alle Möglichkeiten von C ++ (virtuelle Funktionen, Templates und
Funktionsüberladung spielen alle eine wichtige Rolle). Wenn du gerecht bist
Lernen Sie C ++, machen Sie sich keine Sorgen, verwenden Sie einfach ofstream
oder
ostringstream
, wenn Sie eine Instanz erstellen, aber weitergeben
Verweise auf ostream
. Und wenn Sie über Techniken wie virtuell lernen
Überladen von Funktionen, Vorlagen und Operatoren, Rückkehr zu den Iostreams
um zu verstehen, welche Rolle sie bei der Flexibilisierung von Code spielen.
[1] Aus verschiedenen Gründen ist std::streambuf
nicht wirklich abstrakt. Aber
die Implementierungen der virtuellen Funktionen darin sind nutzlos;
Extraktion gibt immer EOF zurück und das Einfügen schlägt immer fehl.
Hier ist eine schöne Ansicht der Vererbungshierarchie für C ++ Stream-Klassen :)
Dieser Artikel in der Sektion
3.1 ofstream and ostringstream
hat, was Sie brauchen.
Im Wesentlichen: Die Klasse ofstream
ermöglicht write data to files using stream operations
und die Klasse ostringstream
ermöglicht write to strings
.
ostream
ist allgemeiner (Unterklassen unterstützen das Schreiben an verschiedene Stellen), ostringstream
ist ein spezielles, das in string
ostream
hat keine rdbuf
Implementierung dahinter, während ostringstream
einen stringbuf verwendet. Versuchte Dokumentation?
Tags und Links c++ ostream ostringstream