Irgendwie hab ich das Gefühl dass dir nicht so 100%ig klar ist was der Unterschied zwischen Binär- und Textmodus ist. Darum vielleicht an dieser Stelle eine kurze Erklärung (erstmal ganz allgemein und komplett unabhängig von C++):
Zunächst gilt es einmal festzuhalten dass eine Datei
immer(!) nur ein Haufen Bytes ist. Es kommt immer
nur darauf an
wie diese Bytes
interpretiert werden. Wenn du eine Datei im Editor öffnest dann interpretiert dieser sie als Textdatei, das bedeutet er interpretiert jedes Byte der Datei als Buchstabe und zeigt dann eben für jedes Byte an der entsprechenden Stelle den Buchstaben an der dem jeweiligen Bytewert entspricht. Wenn die Bytes in der Datei keinen Text repräsentieren dann wird einem der Editor natürlich nur unlesbaren "Müll" anzeigen da die einzelnen Bytes dann eben keine Buchstaben repräsentieren sondern etwas anderes. Wenn die Datei zum Beispiel einen 4 Byte langen integer mit dem Wert 926300213 (in Hex 0x37363835) enthält dann wird der Editor dir an dieser Stelle den Text #&$% anzeigen da (nach der ASCII Zeichentabelle) die einzelnen Bytes des int eben diesen Buchstaben entsprechen würden. Das bedeutet aber auch wenn du ein char Array das einen Text enthält in eine Datei schreibst dann wirst du im Editor
immer an der entsprechenden Stelle in der Datei den Text sehen, egal ob die Datei im Binär oder Textmodus geschrieben wurde.
Man beachte dass ich hier ständig von Binär- bzw Text
modus rede und
nicht von Binär- oder Text
datei. Das hat einen einfachen Grund: Ich will damit unmissverständlich klar machen dass es sich nicht um zwei verschiedene Arten von Dateien handelt sondern lediglich um zwei verschiedene Arten des Datei
zugriffes. Es gibt nur eine Art von Datei, nämlich das was (wie eingangs erwähnt) jede Datei ist: Ein Haufen Bytes.
Wo liegt dann nun aber der Unterschied zwischen Binär- und Text
modus? Ganz einfach: Auf verschiedenen Betriebssystemen gibt es historisch bedingt unterschiedliche Standards wie gewisse Dinge wie z.B. Zeilenumbrüche ('\n') gehandhabt werden. Unter Windows beispielweise wird ein Zeilenumbruch durch die Bytesequenz 0xD gefolgt von 0xA (entspricht '\r' gefolgt von '\n', carriage return + line feed wie es früher bei Fernschreibern gemacht wurde) dargestellt während auf Unix basierten Systemen nur 0xA (einfach nur '\n') verwendet wird. Damit man sich nicht ständig um solche betriebssystemspezifischen Feinheiten kümmern muss gibt es den sog. Textmode. Ist eine Datei im Textmodus geöffnet dann wird beim Schreiben automatisch jedes Byte das einem '\n' entspricht in die jeweilige betriebssystemspezifische Repräsentation umgewandelt (unter Windows wird ein '\n' beim Schreiben in die Datei also zu einem '\r' '\n'). Analog dazu wird beim Lesen ebenfalls automatisch von der betriebssystemspezifischen Repräsentation zurück in '\n' umgewandelt (unter Windows wird die Bytefolge '\r' '\n' beim Lesen aus der Datei also zu einem '\n'). Im Binärmodus wird dagegen keine Umwandlung vorgenommen, alles was du liest oder schreibst entspricht 1:1 dem was auch in der Datei steht. Das ist alles.
Der Editor arbeitet natürlich entsprechend der unter Windows üblichen Konvention und zeigt genau dann einen Zeilenumbruch an wenn in der Datei auch ein '\r' '\n' steht. Wenn in der Datei nur ein '\n' steht dann wird er es als Buchstabe interpretieren was, je nach Schriftart, normalerweise einem kleinen Kästchen entspricht. Wenn du schonmal Text im Binärmodus geschrieben hast oder versucht hast eine unter Linux erzeugte Textdatei im Windows Editor zu öffnen wird dir vermutlich aufgefallen sein dass er statt Zeilenumbrüchen einfach nur kleine Kästchen anzeigt. Jetzt kennst du den Grund dafür.
Wo wir nun wissen was genau Text- und Binärmodus sind wollen wir uns anschauen was der Unterschied zwischen read() bzw. write() und dem >> bzw. << Operator ist. Und auch das ist nicht weiter kompliziert: read() und write() lesen bzw. schreiben einfach eine Bytesequenz aus bzw. in eine Datei. Die >> und << Operatoren dagegen machen formatierten Input/Ouput. D.h. sie wandeln was ihnen übergeben wird in eine Textrepräsentation um und schreiben diese in die Datei bzw. lesen eine Textrepräsentation aus einer Datei und wandeln sie in ein entsprechendes Objekt um. Wenn du beispielweise einen int mit dem Wert 201985291 (Hex 0x0C0A0D0B) per << in eine Datei ausgibst so schreibt << nicht direkt die Bytes des int in die Datei sondern erzeugt eine Zeichenfolge die den Wert dieses int repräsentiert und schreibt diese in die Datei. Im konkreten Beispiel landen dann also nicht 4 Bytes mit den Werten 0x0B 0x0D 0x0A 0x0C in der Datei sondern eine Bytesequenz die der Zeichenfolge '2' '0' '1' '9' '8' '5' '2' '9' '1' entspricht. Der >> Operator tut natürlich genau das gleiche nur in die andere Richtung, würde also die Zeichenfolge wieder auslesen und zu einem int mit dem Wert 201985291 machen. Wichtig ist dass all das
unabhängig vom Modus in dem die Datei geöffnet wurde gemacht wird. Im Textmodus finden wie bereits besprochen automatische Umwandlungen statt und im Binärmodus nicht, ganz egal ob du mit write(), read(), << oder >> schreibst/liest. Wenn man Gebrauch vom formatierten Input/Output der >> bzw. << Operatoren macht dann tut man dies nur eben meistens genau dann wenn man mit Textdateien arbeitet und wenn man mit Textdateien arbeitet wird man normalerweise den Textmodus benutzen. Wenn man analog dazu keine für Menschen lesbare Form braucht und einfach direkt Daten lesen/schreiben will wird man dies mit read()/write() im Binärmodus tun da die automatischen Umwandlungen des Textmodus dabei unerwünscht sind (würdest du den int mit dem Wert 0x0C0A0D0B von vorhin im Textmodus per write() in die Datei schreiben so würde das dritte Byte, das zufällig einem '\n' entspricht, umgewandelt und am Ende ein komplett anderer Wert in der Datei landen).
Ich hoffe ich hab nun ein wenig Licht ins Dunkel gebracht und bin mir ziemlich sicher dass du mit diesem Wissen in der Lage sein wirst dein Problem zu lösen