2014-09-03 16 views
8

Wenn mein Buch sagt: Ein Stream ist eine Folge von Zeichen gelesen oder geschrieben von einem Gerät, dann mein Buch sagt: die istream und die ostream Typen darstellen Eingabe und Ausgabe Stream (was bedeutet es?) Wie genau funktionieren cout und cin ?Was genau ist ein Stream?

Ich bin keine Sprache native und ich kann nicht verstehen, wenn mein Buch sagt: der Ausgabeoperator schreibt den gegebenen Wert auf der gegebenen ostream.

+1

Dämpfe können bidirektional oder unidirektional sein. Das ist alles –

+0

erhalten Sie einen guten Überblick über die Stream-Klassen hier: http://www.cplusplus.com/reference/iolibrary/ – BeyelerStudios

Antwort

3

Sie können es in einfachen Worten als den Datenfluss definieren, der der Eingangs- und der Ausgangsstrom sein können. Man kann sich also den Fluss von Daten von einem Programm zu einer Datei oder umgekehrt vorstellen. Das Bild unten kann Ihnen helfen, es besser zu verstehen:

enter image description here

enter image description here

Von MSDN

Der Strom der zentrale Begriff der iostream-Klassen ist. Sie können ein Stream-Objekt als eine Smart-Datei, die als Quelle und Ziel für Bytes. Die Eigenschaften eines Streams werden von seiner Klasse und von angepassten Einfüge- und Extraktionsoperatoren bestimmt.

8

Der Grundgedanke hinter der Metapher eines „Stream“ ist, dass es bereitstellt oder verbraucht Daten in einer Single-Pass- Mode: zum Beispiel für einen Eingangsstrom, Daten genau einmal erzeugt werden. Sie können den Stream nach weiteren Daten fragen, und sobald der Stream Ihnen die Daten gegeben hat, werden Sie nie wieder die gleichen Daten erhalten.

Aus diesem Grund, um etwas Sinnvolles mit Strömen zu tun, werden Sie sehr in der Regel eine Art Puffer anhängen möchten (ein „Strompuffer“, wenn man so will) mit dem Strom, der einige (meist kleine) speichert Datenmenge, die aus dem Stream in einem Speicher mit wahlfreiem Zugriff, inspizierbar und verarbeitbar extrahiert wurde. (Es gibt ähnliche umgekehrte Ideen für Ausgabeströme.)

Gelegentlich ist es sinnvoll, Ströme ohne Pufferung zu verarbeiten. Wenn Sie beispielsweise einen Eingabe- und einen Ausgabestream haben und Ganzzahlen aus der Eingabe lesen und den doppelten Wert jeder Ganzzahl in die Ausgabe schreiben, können Sie dies ohne Pufferung tun.

Also wenn Sie über Bereiche von Daten denken, sind Streams Dinge, die Sie nur einmal und nie wieder durchlaufen können. Wenn Sie in Bezug auf Forward-Fortschritt denken, dann haben Streams eine andere Eigenschaft, die sie blockieren können: ein Eingabestream kann blockieren, wenn es keine Daten hat, und ein Ausgabestream kann blockieren, wenn es keine weiteren Daten akzeptieren kann . Auf diese Weise können Sie sich innerhalb der Programmlogik vorstellen, dass ein Eingabestrom immer Daten enthält, bis sein Ende erreicht ist, aber ein Programm, das darauf angewiesen ist, kann für eine beliebige, unbegrenzte Wanduhrzeit laufen.

+0

Könnte nützlich sein, um darauf hinzuweisen, dass die Terminal-Geschichte als über eine CRT (oder moderne Äquivalent (lol)) angezeigt) ist in diesem Zusammenhang ein Puffer. –

1

Aus der Sicht der Sprache sind Streams nur Objekte mit einer bestimmten streamähnlichen Schnittstelle: Sie ermöglichen es Ihnen, Daten daraus zu extrahieren (einen Eingabestream) oder Daten hineinzuschieben (einen Ausgabestream). Eingabestreams erlauben keinen wahlfreien Zugriff (was auch immer das bedeuten mag) auf die Daten, die sie bereitstellen (was auch immer das sein mag).

Beachten Sie, dass dies eine reine Schnittstellenbeschreibung für eine Klasse ist, nicht mehr. Wo der Stream seine Daten von/bekommt, was er mit den Daten macht, die in ihn hineingeschoben werden, liegt ganz bei dem Stream. Ein Stream ist eine Abstraktion für das Empfangen/Senden von Daten.

Eine konkrete Implementierung eines Strom kann Daten von einer Terminalanwendung gelesen und an das Programm vorhanden ist (cin), kann ein anderes Zeichen an die Terminalanwendung wie die Programmanforderungen zurück (cout), kann ein drittes Lese-/Schreibe Daten von/in eine Datei (die fstream s), ein viertes kann Daten lesen/schreiben von/in einen Speicherpuffer (stringstream), ein fünftes kann Daten von einem Zufallszahlengenerator "lesen", und so weiter. Die Möglichkeiten sind zahlreich, ebenso wie die verschiedenen Implementierungen der Stream-Schnittstelle, die erstellt wurden.

Das ist die Schönheit der Abstraktion von Streams: Es ist eine sehr flexible Möglichkeit für ein Stück Code zu kommunizieren. Der Prozess muss nichts über die Quelle/das Ziel seiner Daten wissen, außer dass er Daten von/zu ihm lesen/schreiben kann.