2010-02-08 4 views
17

Ich versuche, den Unterschied zwischen Öffnen einer Datei wie um herauszufinden:Was ist der Unterschied zwischen dem Öffnen einer Datei mit ios :: binary oder ios :: out oder beiden?

fstream *fileName*("FILE.dat",ios::binary); 

oder

fstream *fileName*("FILE.dat",ios::out); 

oder

fstream *fileName*("FILE.dat",ios::binary | ios::out); 

ich, dass identisch sind alle diese Formen gefunden: In allen Fällen wird die gleiche Ausgabe für die Datei entweder mit *fileName*<< oder *fileName*.write() erstellt.

Antwort

22

ios::out öffnet die Datei zum Schreiben.

ios::binary stellt sicher, dass die Daten gelesen oder geschrieben werden, ohne neue Zeilenzeichen von und auf \r\n im laufenden Betrieb zu übersetzen. Mit anderen Worten, genau das, was Sie dem Stream geben, ist genau das, was geschrieben wurde.

+0

und was bedeutet es, beide zu verwenden? –

+0

Nun, Sie würden in eine Datei schreiben, ohne irgendwelche Zeichen zu übersetzen. –

+2

Also wenn ich einen ifstream nicht als binär markieren und lesen, sagen wir 10 Doubles davon, und Windows findet ein zufälliges '\ n' in den Daten, dann wird der Stream von '10 * sizeof (double)' auf expandiert '10 * sizeof (double) + 1' als ein' \ r' wird eingefügt und überschreibt dann das Ende meines Doppelpuffers? – user14717

4

Das Öffnen einer Datei mit ios :: binary steuert, wie mit Newline-Zeichen umgegangen wird. Unter Windows werden sie zu CRLF-Paaren erweitert. Das ist es - es hat keine Auswirkung darauf, wie Dinge wie der Operator < < funktionieren.

+0

aber was sind CLRF-Paare? –

+2

CLRF steht für Wagenrücklauf, Zeilenvorschub. Dies sind die zwei Bytes, die zum Angeben einer neuen Zeile in der Windows-Textcodierung verwendet werden. Es ist meistens überflüssig, weil Sie auf einem Computer wirklich nur ein Zeichen für eine neue Zeile benötigen. –

+3

Vor langer Zeit, in den Tagen der Teletypen und Schreibmaschinen, hatten Ausgabemaschinen Wagen, die sich nach links bewegten, um zu schreiben, während Zeichen gedruckt wurden. Ein Befehl, Wagenrücklauf, bewegte den Wagen zurück nach links. Ein anderer Befehl, 'Linefeed', brachte das Papier zur nächsten Zeile. Diese beiden Befehle können unabhängig voneinander ausgeführt werden, so dass das Papier in der Mittellinie (unter Verwendung von "Zeilenvorschub") vorgerückt wird oder die aktuelle Zeile (unter Verwendung von "Zeilenvorschub") neu geschrieben wird. Als Paar bewirken sie, dass der Druck am linken Rand der nächsten Zeile beginnt. –