Was ist der Unterschied zwischen istreambuf_iterator
und istream_iterator
? Und im Allgemeinen, was ist der Unterschied zwischen Streams und Streambufs? Ich kann wirklich keine klare Erklärung dafür finden, also beschlossen, hier zu fragen.C++ Streams Verwirrung: istreambuf_iterator vs istream_iterator?
Antwort
IO-Streams verwenden streambufs als Quelle/Ziel der Eingabe/Ausgabe. Effektiv erledigt die streambuf-Familie die gesamte Arbeit in Bezug auf IO und die IOstream-Familie wird nur für die Formatierung und für die String-/from-string-Transformation verwendet. Jetzt
, nimmt istream_iterator
eine Vorlage Argument, das sagt, was der unformatierte String-Sequenz aus dem streambuf sollte so formatiert werden, wie istream_iterator<int>
interpretieren wird (durch Leerzeichen getrennt) alle eingehenden Text als int
s.
Auf der anderen Seite kümmert sich istreambuf_iterator
nur um die rohen Zeichen und iteriert direkt über die zugehörige streambuf der istream
, dass es übergeben wird.
Im Allgemeinen, wenn Sie nur an den rohen Zeichen interessiert sind, verwenden Sie eine istreambuf_iterator
. Wenn Sie an der formatierten Eingabe interessiert sind, verwenden Sie istream_iterator
.
Alles, was ich sagte, gilt auch für ostream_iterator
und ostreambuf_iterator
.
Hier ist ein wirklich schlecht gehütetes Geheimnis: ein Iostream per se, hat fast nichts mit dem tatsächlichen Lesen oder Schreiben von/zu einer Datei auf Ihrem Computer zu tun.
Ein Iostream im Grunde als „Heiratsvermittler“ wirkt zwischen einem streambuf und einem locale:
Die Iostream speichern einigen Zustand über, wie Conversions sollte (zB die aktuelle Breite und Genauigkeit für ein getan werden Umwandlung). Es verwendet diese, um das Gebietsschema zu steuern, wie und wo eine Umwandlung durchzuführen ist (z. B. wandle diese Zahl in eine Zeichenkette in diesem Puffer mit der Breite 8 und der Genauigkeit 5 um).
Obwohl Sie nicht direkt danach gefragt haben, ist das Gebietsschema seinerseits wirklich nur ein Container - aber (für eher eine Kuriosität) ein typensicherer heterogener Container. Die Dinge, die es enthält, sind facet
s. Ein Facettenobjekt definiert eine einzelne Facette eines allgemeinen Gebietsschemas. Der Standard definiert eine Reihe von Facetten für alles von Lesen und Schreiben von Zahlen (num_get
, num_put
) bis zur Klassifizierung von Zeichen (die ctype Facette).
Standardmäßig verwendet ein Stream das Gebietsschema "C". Das ist ziemlich einfach - Zahlen werden nur als ein Strom von Ziffern konvertiert, die einzigen Dinge, die sie als Buchstaben erkennt, sind die 26 Kleinbuchstaben und 26 Großbuchstaben in Englisch und so weiter. Sie können jedoch imbue
einen Stream mit einem anderen Gebietsschema Ihrer Wahl senden. Sie können Gebietsschemas auswählen, die von in Strings angegebenen Namen verwendet werden. Besonders interessant ist eine, die durch eine leere Zeichenfolge ausgewählt wird. Die Verwendung einer leeren Zeichenfolge weist die Laufzeitbibliothek im Wesentlichen an, das Gebietsschema auszuwählen, von dem sie "denkt", dass es am besten geeignet ist, in der Regel basierend darauf, wie der Benutzer das Betriebssystem konfiguriert hat. Dadurch kann Code Daten in einem lokalisierten Format verarbeiten, ohne für ein bestimmtes Gebietsschema explizit geschrieben zu werden.
der grundlegende Unterschied zwischen einem istream_iterator
So, und ein istreambuf_iterator
ist, dass die Daten aus einem istreambuf_iterator kommt nicht durch (die meisten der) Transformationen durch das Gebietsschema getan gegangen ist, aber Daten aus einer istream_iterator
kommenden umgewandelt worden nach dem Gebietsschema.
Für das, was es wert ist, dass „die meisten“ im vorigen Absatz wird auf die Tatsache, dass, wenn Sie Daten von einem istreambuf lesen (über einen Iterator oder aus anderen Gründen) ein wenig locale-basierte Transformation ist erledigt: zusammen mit verschiedenen "Formatierung" Arten von Dingen, das Gebietsschema enthält eine Codecvt-Facette, die verwendet wird, um von einigen externen Darstellung zu einigen internen Darstellung (z. B. UTF-8 zu UTF-32) zu konvertieren.
Es kann mehr Sinn machen, die Tatsache zu ignorieren, dass sie in einem locale beide gespeichert sind, und denkt nur an den einzelnen Facetten beteiligt:
Also das ist der wirkliche Unterschied zwischen einem istream_iterator
und ein istreambuf_iterator
. Ein wenig Transformation wird (zumindest potentiell) an den Daten von beiden vorgenommen, aber im Wesentlichen erfolgt weniger für die Daten, die von einem istreambuf_iterator
stammen.
Gute Erklärung. Was ist mit der Verwendung von Streambufs direkt für rohe Binärdaten, ist das möglich? – Pavel
@Pavel: So funktionieren die C++ - Iostreams nicht, aber zumindest theoretisch gibt es keinen Grund, warum sie das nicht könnten. Ich bezweifle aber, dass Sie das möchten - wenn Sie das täten, müssten Sie die 'codecvt'-Konvertierung jeweils ein Zeichen nach dem anderen anwenden, während Sie die Daten aus dem Rohpuffer lesen, von dem ich glaube, dass er normalerweise einen fairen Wert verliert Menge an Geschwindigkeit (verglichen mit der Umwandlung eines ganzen Puffers gleichzeitig). –
Das ist der Grund, warum ich Iostreams nicht verwenden möchte, da ich nicht möchte, dass Codecvt beteiligt ist. – Pavel
- 1. C++ - Array vs C# ptr Geschwindigkeit Verwirrung
- 2. Binärdaten vs Zeichendaten Verwirrung
- 3. Streams vs Monaden
- 4. Node.js Streams vs Observables
- 5. Wie kann ich eine 0xFF in einer Datei mit libC++ iStream_iterator lesen?
- 6. Verwirrung C
- 7. Funktion vs Variablendeklaration in C++
- 8. Verwirrung in #import vs @class
- 9. Meteor: Angular2 VS Blaze Verwirrung
- 10. std :: istream_iterator stoppt vorrückenden
- 11. Scala Universal-vs Existentielle Art Verwirrung
- 12. C Statische Funktion Verwirrung
- 13. Einfache C Zeiger Verwirrung
- 14. C++ Lambda Ausdruck Verwirrung
- 15. C++ Pointers Verwirrung
- 16. C++ Variable Verwirrung
- 17. C# Initialisierung Verwirrung!
- 18. Elementary C++ Typ Verwirrung
- 19. Bitverschiebung Verwirrung in C#
- 20. C-Array-Adresse Verwirrung
- 21. C# versteckt Verwirrung
- 22. C++ boolalpha Verwirrung
- 23. Verkettung von C++ - Streams
- 24. Sammlung vs Modell Verwirrung in backbone.js
- 25. Verwirrung über statische Zellen vs dynamische Zellen
- 26. TCP/UDP vs Circut/Packet Switching Verwirrung
- 27. Coping-Streams - Nios Kanäle vs. io
- 28. Apache Spark Streaming vs Spring XD Streams
- 29. HTTP/2 Streams vs HTTP/1.1 Verbindungen
- 30. Objective C Klasse Definition Verwirrung
"Wenn Sie nur an den rohen Charakteren interessiert sind, verwenden Sie einen istream_iterator" - sollte das "istreambuf_iterator" sein? – Mankarse
@Mankarse: Ähm, natürlich danke. – Xeo
Dadurch wurde es für mich viel klarer, danke! – dextrey