2015-09-01 10 views
7

Ich versuche, eine UTF-16-codierte Datei mit std :: ofstream() zu schreiben. Selbst im Binärmodus wird das Schreiben "\n\0" als "\r\n\0" geschrieben. Beispielcode:std :: ofstream schreibt r sogar im Binärmodus

std::string filename = ... 
std::ofstream fout(filename, std::ios_base::binary); 
fout.write("\xff\xfe", 2); 
fout.write("\n\0", 2); 
fout.close(); 

Die Hex-Daten der resultierenden Datei ist:

ff fe 0d 0a 00 

ich etwas falsch zu machen sein. Irgendwelche Ideen um zu verhindern, dass das 0x0d geschrieben wird?

I 2013.

Update-MS Visual Studio bin mit: Es begann unerklärlich wie erwartet funktioniert. Schreibe es auf Geister in der Maschine.

+0

Im Binärmodus sollte es keine Übersetzung geben . Wenn es eine Übersetzung gibt, liegt irgendwo ein Fehler vor. –

+1

Was ist mit 'fout.write (" \ x0a \ 0 ", 2);'? –

+0

Das würde funktionieren, aber das OP geht in die falsche Richtung. Dieser Pfad wird nur zu mehr Schmerz und Elend und Unicode-Fehlern führen. –

Antwort

-4

Das ist von Entwurf. Das Zeichen \ n wird in den EOL-Marker für Ihre Plattform konvertiert, und daher interpretiert die Funktion ofstream :: write es richtig. Wenn Sie eine Binärdatei schreiben möchten, können Sie keine speziellen Textzeichen verwenden.

Klarstellung: Ich schaffte es ein wenig Verwirrung über zu schaffen, was der Compiler tut. Grundsätzlich ist das \ n ein Sonderzeichen, das "EOL/Ende der Zeile" bedeutet. Dies ist abhängig davon, auf welcher Plattform Sie sich zusammensetzen.

Nun ist die write() Funktion ein Array von Bytes, nimmt in den Stream zu schreiben. Der C-Standard unterscheidet nicht wirklich zwischen einer Zeichenkette (technisch keine solche Sache in C) und einem Array von Zeichen (oder Bytes), so dass Sie damit durchkommen können. Was während der Kompilierzeit passiert, ist, dass diese Zeilen in etwas wie diese konvertiert werden:

fout.write({255, 254, 0}, 2); // "\xff\xfe" 
fout.write({13, 10, 0, 0}, 2); // "\n\0" 
fout.close(); 
+0

Würde die Übergabe von '\ x0A' (Zeilenvorschubzeichen) funktionieren? Ich denke nur "\ n" hat die besondere Bedeutung, aber ich bin mir nicht sicher. – SirGuy

+0

Möglicherweise?Wenn Sie UTF-16-Dateien schreiben möchten, sollten Sie die richtigen Bibliotheksfunktionen (normalerweise die wc-Funktionen) verwenden und nicht versuchen, UTF manuell zu codieren. Der Standard ist kompliziert genug, dass Sie es wahrscheinlich nicht richtig machen werden. –

+1

Die neue Zeilenübersetzung in CR + LF erfolgt in der Laufzeit, nicht der Compiler. Und zwar nur im Textmodus, nicht binär. Die Verwendung von 'fout.write (" \ x0a ", 1)' hat denselben Effekt. – Jason

1

Sie haben 4 Bytes gesendet, um ausgegeben zu werden. 5 wurden in der Ausgabe beobachtet.

Sie wurden mit irgendwie nicht Binär-Modus. Es gibt keine andere Möglichkeit, wie Sie .write (buf, 2) und .write (buf, 2) verwenden und 5 Bytes ausgeben können.

Wahrscheinlich in Messing/Spiel mit Dingen (wie die Menschen immer tun, wenn sie versuchen, herauszufinden, warum merkwürdiges Verhalten) Sie etwas verändert es tatsächlich verursacht in den Binärmodus behaupten.

Wenn Sie zuvor versucht haben, entweder STDOUT oder STDERR auszugeben, ist es durchaus möglich, dass windows automatisch das '\ r' in den Stream eingefügt hat, da STDOUT und STDERR fast immer Text sind und Ihren Versuch hätte überschreiben können um es in den binären Modus zu versetzen. (Nein, wirklich. Nein, Sie verwenden Visual Studio, das ist ein wirklich. Ja, wenn Sie Cygwin verwenden, ist das nicht wahr, aber Sie verwenden VS.)