C++ - stream-Datei öffnen-Modi Mehrdeutigkeit
Für die Durchführung von Datei-E /a in C++ verwenden wir die ofstream, ifstream und fstream sind Klassen.
- ofstream: Stream-Klasse zu schreiben auf Dateien
- ifstream: Klasse Stream zum Lesen von Dateien
- fstream sind: Stream-Klasse Lesen und schreiben von/auf Dateien
Den Prozess der Zuordnung einer Datei mit einem stream-Objekt wird als "öffnen der Datei".
Beim öffnen einer Datei können wir festlegen, in welchem Modus die Datei geöffnet werden soll.
Meine Anfrage ist im Zusammenhang mit der ios::out
und ios:in
Modi.
Wenn ich eine ofstream
Objekt aus und öffnen Sie die Datei mit ios::in
- Modus, ich bin in der Lage,
schreiben Sie in die Datei aber nur, wenn seine bereits erstellt(mit ios::out
- Modus-Datei wird auch dann erstellt, wenn es nicht bereits vorhanden ist).
Aber wenn ich ifstream
Objekt aus und öffnen Sie die Datei mit ios::out
- Modus, ich bin in der Lage, die Datei zu Lesen.
Meine Frage ist, warum diese Modi (ios::in
/ios::out
) geliefert werden, die von der Sprache, wenn die Art des Streams(ifstream
/ofstream
) selbst gibt an, welche Art von operation(input/output) durchgeführt ?
Auch der Grund, warum diese unklare Verwendung(ofstream
mit ios::in
und ifstream
mit ios::out
) arbeitet in eine Falle und schlägt(aber nur, wenn die Datei nicht bereits vorhanden ist) in einem anderen ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
ofstream
,ifstream
undfstream
Klassen sind high-level-Schnittstellen für die Untergebenenfilebuf
, die man bekommen kann durch dierdbuf()
member-Funktion des Stroms.Gemäß der Norm beim öffnen einer
ofstream
mit einigen modemode
es öffnet sich die Unterstreichung stream buffer als mitmode | ios_base::out
. Analogifstream
verwendetmode | ios_base::in
.fstream
übergibt diemode
parameter wörtlich zu unterstreichen stream-Puffer.Was das obige bedeutet, dass der folgende code öffnet die Datei mit exakt dem gleichen open-flags:
Nach diesen Zeilen können Sie genau das tun, die gleichen Dinge mit
f.rdbuf()
,g.rdbuf()
undh.rdbuf()
, und alle drei wirken, als ob Sie öffnete die Datei mit dem C Aufruffopen("a.txt", "r+")
, die Ihnen lese - /Schreibzugriff, die die Datei nicht abgeschnitten, und schlägt fehl, wenn die Datei nicht vorhanden ist.So, warum tun, haben wir drei verschiedene Klassen? Wie ich bereits sagte, sind diese high-level-Klassen und bietet eine high-level-Schnittstelle an, über die lower-level-stream-Puffer. Die Idee ist, dass
ifstream
hat member-Funktionen für die Eingabe (wieread()
),ofstream
hat member-Funktionen für die Ausgabe (wiewrite()
), währendfstream
hat beides. Zum Beispiel können Sie nicht tun:Aber das funktioniert, weil, obwohl
g
ist einifstream
hatten wir es geöffnet haben, mitios_base::out
:Weil die mode beschränkt sich nicht auf input/output. Der Konstruktor der
ifstream
zum Beispiel sieht wie folgt aus:Hinweis: der Standardwert ist
ios_base::in
, so dass Sie nicht haben, geben Sie es sich selbst. Jedoch, diemode
legt die streams flags, die nicht beschränkt aufin
/out
, aber gehören:app
(append), stellen Sie die stream-position Indikator, um das Ende des Streams vor jeder Ausgabe-operation.ate
(am Ende) stellen Sie die stream-position Indikator, um das Ende des Streams beim öffnen.binary
(Binär) Betrachten stream als Binär anstatt als text.in
(Eingabe) Eingabe-Operationen auf dem stream.out
(output) Ermöglichen die Ausgabe-Operationen auf dem stream.trunc
(truncate) keine aktuellen Inhalt verworfen wird, vorausgesetzt, eine Länge von null auf öffnen.