Was ist der einfachste Weg, um nach stdout schreiben im Binärmodus?
Ich habe versucht, herauszufinden, der beste Weg, um zu schreiben von binären Daten auf stdout aus einem C-Programm. Es funktioniert gut unter Linux, aber ich habe Probleme, wenn ich kompilieren auf Windows, weil "\n" wird umgewandelt in "\r\n".
Ist es ein standard-Weg, um nach stdout schreiben in eine Art von Binär-Modus, der verhindert newline-Konvertierung? Wenn nicht, was ist der einfachste Weg, um Windows zu beenden, dies zu tun?
Bin ich mit GCC und MinGW.
- Wie sind Sie derzeit ausgeben für Zeug?
- haben Sie versucht, mit
fwrite
stattprintf
? - Ich bin derzeit mit fwrite.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
setmode(fileno(stdout), O_BINARY)
Wickeln Sie es in einem ifdef-wenn Sie möchten, um es kompatibel mit Linux.
Siehe auch: https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setmode?view=vs-2017
freopen(NULL, "wb", stdout)
können auch verwendet werden, und ist tragbar C. es kann Jedoch zu unerwünschten abschneiden Effekte; siehe Anwendung im Abschnitt pubs.opengroup.org/onlinepubs/9699919799/functions/freopen.html. Für was es Wert ist, ich denken, dass dieser text falsch ist; wenn der neue Dateiname ist NULL, es gibt keine zugrunde liegendenopen
Betrieb und damit der text überO_TRUNC
gilt nicht.freopen
mit einemNULL
Dateinamen in Windows, es werden die ungültigen parameter handler nach diesem: msdn.microsoft.com/en-us/library/wk2h68td.aspx und dem Standardverhalten der invalid parameter handler ist die Anwendung zum Absturz bringen.freopen
, also ich würde sagen das ist ein Fehler in MSVCRT..._setmode
Funktion.Können Sie etwas tun, wie (welche Art von cross-Plattform):
Oder verwenden Sie
write()
undread()
system-Aufrufe direkt mitfileno(stdin)
undfileno(stdout)
. Diese Systemaufrufe arbeiten auf der unteren Ebene und nicht alle Konvertierungen. Aber Sie haben auch nicht die Pufferung, die Sie vonFILE
streams.write()
scheint falsch zu sein, bekomme ich noch newline Konvertierungen mit eswrite()
istman -s 2 write
. Es gibt keine text - /Binär-Modi auf diesem Niveau.