Unterschied zwischen dem Öffnen einer Datei in Binär gegenüber Text [Duplizieren]

8

Ich habe einige Sachen gemacht wie:

%Vor%

und in der generierten Textdatei steht "abc123" wie erwartet. Aber dann tue ich:

%Vor%

und erhalten das exakt gleiche Ergebnis. Wenn ich die Datei im Binär- oder Normalmodus lese, bekomme ich dasselbe Ergebnis. Also meine Frage ist, was ist der Unterschied zwischen Foppen mit oder ohne Binärmodus.

Wo ich über fopen-Modi gelesen habe: Ссылка

    
BWG 31.12.2013, 22:51
quelle

2 Antworten

10

Der Link, den Sie angegeben haben, beschreibt die Unterschiede, ist aber unten auf der Seite verborgen:

Ссылка

  

Textdateien sind Dateien, die Sequenzen von Textzeilen enthalten. Abhängig von der Umgebung, in der die Anwendung ausgeführt wird, kann es bei den Eingabe- / Ausgabevorgängen im Textmodus zu einer speziellen Zeichenkonvertierung kommen, um sie an ein systemspezifisches Textdateiformat anzupassen . Obwohl in einigen Umgebungen keine Konvertierung stattfindet und sowohl Textdateien als auch Binärdateien auf die gleiche Weise behandelt werden, verbessert die Verwendung des entsprechenden Modus die Portabilität.

Die Umwandlung könnte sein, \r\n auf \n zu normalisieren (oder umgekehrt) oder vielleicht Zeichen jenseits von 0x7F zu ignorieren (a-la 'Textmodus' in FTP). Persönlich würde ich alles im Binärmodus öffnen und eine gute Textcodierungsbibliothek für den Umgang mit Text verwenden.

    
Dai 31.12.2013, 22:53
quelle
5

Der wichtigste Unterschied, den Sie beachten sollten, ist, dass Sie bei einem im Textmodus geöffneten Stream newline-Übersetzung auf Nicht-Nix-Systemen erhalten (er wird auch für die Netzwerkkommunikation verwendet, ist dies aber nicht) unterstützt von der Standardbibliothek). In * nix newline ist nur der ASCII-Zeilenvorschub, \n , sowohl für die interne als auch für die externe Darstellung von Text. In Windows verwendet die externe Repräsentation oft ein Carriage Return + Linefeed-Paar "CRLF" (ASCII-Codes 13 und 10), das bei Eingabe in eine einzelne \n und umgekehrt in Ausgabe konvertiert wird.

Aus dem C99-Standard (das N869-Entwurfsdokument), §7.19.2 / 2,

  

Ein Text-Stream ist eine geordnete Folge von Zeichen, die in Zeilen, jede Zeile, zusammengefügt sind   bestehend aus null oder mehr Zeichen plus einem abschließenden Zeilenumbruchzeichen. Ob die   Die letzte Zeile erfordert, dass ein abschließendes Zeichen für eine neue Zeile implementiert wird. Figuren   müssen möglicherweise am Eingang und am Ausgang hinzugefügt, geändert oder gelöscht werden, um sich anzupassen   Konventionen für die Darstellung von Text in der Host-Umgebung. Daher muss es kein One-   Eins-zu-eins-Entsprechung zwischen den Zeichen in einem Stream und denen in der externen   Darstellung. Aus einem Textstream eingelesene Daten werden notwendigerweise mit den Daten verglichen   die zuvor in diesen Stream geschrieben wurden, nur wenn: die Daten nur aus Drucken bestehen   Zeichen und die Steuerzeichen horizontale Registerkarte und neue Zeile; kein neues Zeilenzeichen ist   unmittelbar vorangestellt von Leerzeichen; und das letzte Zeichen ist ein Zeichen für eine neue Zeile.   Ob Leerzeichen, die unmittelbar vor einem Zeichen für eine neue Zeile ausgegeben werden   erscheinen, wenn das Einlesen implementiert ist.

Und in §7.19.3 / 2

  

Binärdateien werden nicht abgeschnitten, außer wie in 7.19.5.3 definiert. Ob ein Text geschrieben wird   stream bewirkt, dass die verknüpfte Datei über diesen Punkt hinaus abgeschnitten wird.   definiert.

Über die Verwendung von fseek , in §7.19.9.2 / 4:

  

Bei einem Text-Stream ist entweder offset gleich Null oder offset ist ein Wert, der von zurückgegeben wird   Ein früherer erfolgreicher Aufruf der Funktion ftell in einem Stream, der derselben Datei und whence zugeordnet ist, muss SEEK_SET sein.

Über die Verwendung von ftell in §17.19.9.4:

  

Die Funktion ftell ruft den aktuellen Wert des Dateipositionsindikators für den Stream ab, auf den stream zeigt. Bei einem binären Stream ist der Wert die Anzahl der Zeichen ab dem Anfang der Datei. Für einen Textstream enthält der Dateipositionsindikator nicht spezifizierte Informationen, die von der fseek -Funktion zum Zurückgeben des Dateipositionsindikators für den Stream an seine Position zum Zeitpunkt des ftell -Aufrufs verwendet werden können. Der Unterschied zwischen zwei solchen Rückgabewerten ist nicht notwendigerweise ein aussagekräftiges Maß für die Anzahl der geschriebenen oder gelesenen Zeichen.

Ich denke, das ist das Wichtigste, aber es gibt einige weitere Details.

    
Cheers and hth. - Alf 31.12.2013 23:56
quelle

Tags und Links