C++: Was ist der Unterschied zwischen ostream und ostringstream?
Was ist der Unterschied zwischen ostream und ostringstream? Wann würden Sie verwenden eine im Vergleich zu den anderen?
- auch ostringstream ist eine abgeleitete Klasse von ostream
Du musst angemeldet sein, um einen Kommentar abzugeben.
Legte kurz und bündig:
ostringstream
bietet einestreambuf
,ostream
fordert den Benutzer zur Verfügung zu stellen.
Die Zusammenhänge zu verstehen, ist es notwendig zu verstehen, ein wenig
wie die streams funktionieren (und im Gegensatz zu einigen anderen Plakate, ich bin nicht sicher, dass
es gibt eine gute explination dieser Website). Die grundlegende Abstraktion
der
ostream
ist die Formatierung textuelle Ausgabe. Sie geben ihm eineint
oder einedouble
(oder einen benutzerdefinierten Typ an—dazu später mehr), und eskonvertieren Sie ihn in einen Strom von Zeichen, der Typ
char
. Was es tutmit, der stream hängt von der
streambuf
angebracht es;dies ist ein Beispiel für die Strategie-Muster, wo
streambuf
ist einabstrakte Basis-Klasse von der Strategie[1]. Der standard bietet zwei
Implementierungen von
streambuf
,filebuf
undstringbuf
; in der Praxisin alle, aber die meisten trivial-Anwendungen, werden Sie wahrscheinlich haben einige, die
Sie selber implementieren.
Beim ausgeben, Sie immer
ostream
; es ist die Klasse, über welche die<<
Operatoren definiert sind. Sind Sie formatieren Sie Ihre Daten in einen streamZeichen, und Sie weiß nicht wirklich, wo der Bach endet.
Beim erstellen einer Instanz: wenn Sie erstellen ein
ostream
können, müssen Siees mit einem
streambuf
selbst. Mehr oft, erstellen Sie eineofstream
oder eineostringstream
. Beide sind "convenience" - Klassen,die Ableitung von
ostream
, und bieten einestreambuf
für Sie (filebuf
und
stringbuf
, wie es geschieht). Praktisch gesprochen, alle Sie tun, istdie notwendigen
streambuf
(wirkt sich auf die Konstruktor-und dieDestruktor, und nicht sehr viel anders sein); im Fall von
ofstream
essind auch ein paar zusätzliche Funktionen, die vorwärts zu den zusätzlichen Funktionen in
die
filebuf
- Schnittstelle.Es ist üblich (aber nicht vorgeschrieben) wenn Sie Ihre eigenen definieren
streambuf
zu bieten Komfort überlastungenostream
(undistream
, falls relevant), entlang den gleichen Linien wieofstream
oderostringstream
.Durch die gleichen token, wenn eine Instanz erzeugen, ist es üblich, dass ein
die "Bequemlichkeit" abgeleitete Klassen, anstatt zu verwenden
ostream
direktund stellen Sie Ihre eigene streambuf.
Und wenn all dies scheint kompliziert: die iostream-Klassen verwenden
über alle Einrichtungen von C++ (virtuelle Funktionen, templates und
das überladen von Funktionen spielen eine wichtige Rolle). Wenn Sie nur
Lern C++, don T Sorge zu viel über es: nutzen Sie einfach
ofstream
oderostringstream
wenn Sie konstruieren eine Instanz, aber pass umVerweise auf
ostream
. Und wie erfahren Sie von Techniken wie virtualFunktionen, templates und operator overloading, zurück zu den iostreams
um zu verstehen, die Rolle, die Sie spielen code flexibler.
[1] aus verschiedenen Gründen
std::streambuf
ist nicht eigentlich Abstrakt. Aberdie Implementierungen von virtuellen Funktionen sind nutzlos;
Extraktion immer wird EOF zurückgegeben, und das einfügen schlägt immer fehl.
Ist hier schöner Blick auf die Vererbungshierarchie für C++ - Stream-Klassen 🙂
Diese Artikel unter dem Abschnitt
3.1 ofstream and ostringstream
hat, was Sie brauchen.Im wesentlichen : Die
ofstream
Klasse macht es möglichwrite data to files using stream operations
und dieostringstream
Klasse macht es möglichwrite to strings
.iostream
sindfstream
undstringstream
. (In der Praxis natürlichfstream
undstringstream
sind fast nie benutzt.)ostream
ist mehr allgemein (Unterklassen-support-writing an verschiedenen Orten),ostringstream
ist ein spezifischer schreibenstring
ostream
hat keinerdbuf
Umsetzung dahinter, in der Erwägung, dassostringstream
verwendet eine stringbuf. Versucht die Dokumentation?ostringstream
wird verwendet, wenn Sie brauchen, stream Zeug instring
, in der Erwägung, dassostream
wird meist als ein Typ für einen parameter (auf die verwiesen wird), wenn der angerufene ist stream der Umsetzung Agnostiker.