Unterschied zwischen Dateien, die im Binär- und Textmodus geschrieben wurden

Welche Übersetzung tritt beim Schreiben in eine Datei auf, die im Textmodus geöffnet wurde, die nicht im Binärmodus erfolgt? Speziell in MS Visual C

unsigned char buffer[256]; for (int i = 0; i < 256; i++) buffer[i]=i; int size = 1; int count = 256; 

Binärmodus:

 FILE *fp_binary = fopen(filename, "wb"); fwrite(buffer, size, count, fp_binary); 

Versus Textmodus:

 FILE *fp_text = fopen(filename, "wt"); fwrite(buffer, size, count, fp_text); 

Ich glaube, dass die meisten Plattformen die Option “t” oder die Option “text-mode” ignorieren, wenn sie mit Streams umgehen. Unter Windows ist dies jedoch nicht der Fall. Wenn Sie sich die Beschreibung der function fopen () in MSDN ansehen, werden Sie feststellen, dass die Angabe der Option “t” folgenden Effekt hat:

  • Zeilenvorschübe (‘\ n’) werden bei der Ausgabe in ‘\ r \ n’-Sequenzen übersetzt
  • Wagenrücklauf- / Zeilenvorschubsequenzen werden bei der Eingabe in Zeilenvorschübe übersetzt.
  • Wenn die Datei im Append-Modus geöffnet wird, wird das Ende der Datei nach einem ctrl-z Zeichen (Zeichen 26) untersucht und dieses Zeichen wenn möglich entfernt. Es wird auch das Vorhandensein dieses Zeichens als das Ende der Datei interpretieren. Dies ist ein unglücklicher Überbleibsel aus den Tagen der CPM (etwas über die Sünden der Eltern, die bei ihren Kindern bis zur dritten oder vierten Generation besucht werden). Entgegen der zuvor geäußerten Meinung wird das Zeichen ctrl-z nicht angehängt.

Im Textmodus kann ein Zeilenumbruch “\ n” in einen Zeilenumbruch + Zeilenumbruch “\ r \ n” konvertiert werden

Normalerweise möchten Sie im Binärmodus öffnen. Der Versuch, irgendwelche Binärdaten im Textmodus zu lesen, funktioniert nicht, es wird beschädigt. Sie können Text im Binärmodus lesen, aber es wird keine automatische Übersetzung von “\ n” nach “\ r \ n” durchgeführt.

Siehe fopen

Wenn Sie eine Datei mit “rt” öffnen, wird die Eingabe außerdem auf einem Crtl-Z-Zeichen beendet.

Ein weiterer Unterschied ist bei der Verwendung von fseek

Wenn der Stream im Binärmodus geöffnet ist, ist die neue Position genau die vom Anfang der Datei gemessenen Bytes, wenn der Ursprung SEEK_SET ist, von der aktuellen Dateiposition, wenn der Ursprung SEEK_CUR ist, und vom Ende der Datei, wenn der Ursprung SEEK_END ist. Einige binäre Streams unterstützen möglicherweise das SEEK_END nicht.

Wenn der Stream im Textmodus geöffnet ist, sind die einzigen unterstützten Werte für den Offset null (was mit jedem Ursprung funktioniert) und ein Wert, der von einem früheren Aufruf von std :: ftell in einem Stream zurückgegeben wird, der derselben Datei zugeordnet ist Ursprung von SEEK_SET.

Wir hatten ein interessantes Problem beim Öffnen von Dateien im Textmodus, wo die Dateien eine Mischung aus Zeilenendenzeichen hatten:

 1\n\r 2\n\r 3\n 4\n\r 5\n\r 

Unsere Anforderung ist, dass wir unsere aktuelle Position in der Datei speichern können (wir haben fgetpos verwendet), schließen Sie die Datei und öffnen Sie später die Datei erneut und suchen Sie nach dieser Position (wir haben fsetpos verwendet).

Wenn eine Datei jedoch Mischungen von Zeilenenden enthält, konnte dieser process nicht die tatsächliche Position erreichen. In unserem Fall (unser Werkzeug analysiert C ++) haben wir Teile der Datei, die wir bereits gesehen hatten, erneut gelesen.

Gehe mit binary – dann kannst du genau kontrollieren, was aus der Datei gelesen und geschrieben wird.