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: Ссылка
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.
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 oderoffset
ist ein Wert, der von zurückgegeben wird Ein früherer erfolgreicher Aufruf der Funktionftell
in einem Stream, der derselben Datei undwhence
zugeordnet ist, mussSEEK_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 denstream
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 derfseek
-Funktion zum Zurückgeben des Dateipositionsindikators für den Stream an seine Position zum Zeitpunkt desftell
-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.