C ++: Was ist der Unterschied zwischen ostream und ostringstream?

7

Was ist der Unterschied zwischen Ostream und ostringstream? Wann würdest du eins gegen das andere benutzen?

    
kmccoy 21.08.2012, 12:03
quelle

4 Antworten

14

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.

    
James Kanze 21.08.2012, 14:16
quelle
8

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 .

    
MimiEAM 21.08.2012 12:19
quelle
5

ostream ist allgemeiner (Unterklassen unterstützen das Schreiben an verschiedene Stellen), ostringstream ist ein spezielles, das in string

schreibt     
Grzegorz Herman 21.08.2012 12:05
quelle
4

ostream hat keine rdbuf Implementierung dahinter, während ostringstream einen stringbuf verwendet. Versuchte Dokumentation?

    
Michael Krelin - hacker 21.08.2012 12:05
quelle

Tags und Links