2013-06-02 3 views
12

Ich habe versucht, herauszufinden, die beste Möglichkeit, binäre Daten aus einem C-Programm zu stdout schreiben. Es funktioniert gut unter Linux, aber ich habe Probleme, wenn ich unter Windows kompiliere, weil "\ n" zu "\ r \ n" konvertiert wird.Was ist der einfachste Weg, um im binären Modus in stdout zu schreiben?

Gibt es eine Standardmethode, um in einer Art binären Modus in stdout zu schreiben, wodurch die Zeilenumbruch vermieden wird? Wenn nicht, was ist der einfachste Weg, Windows dazu zu bringen, dies zu beenden?

Ich benutze GCC und MinGW.

+0

Wie geben Sie gerade Zeug aus? –

+1

haben Sie versucht, 'fwrite' anstelle von' printf' zu verwenden? – tay10r

+0

Ich verwende derzeit fwrite. – jncraton

Antwort

18

können Sie setmode(fileno(stdout), O_BINARY), wenn Sie es mit Linux kompatibel behalten möchten verwenden

es in einer ifdef Wickeln.

Siehe auch http://msdn.microsoft.com/en-us/library/tw4k6df8(v=vs.80).aspx

+0

Das scheint zu funktionieren. Vielen Dank! Zumindest in meiner Umgebung benötigt setmode einen zweiten Parameter. Ich habe die Antwort aktualisiert. – jncraton

+3

'freopen (NULL," wb ", stdout)' kann auch verwendet werden und ist tragbar C. Es kann jedoch unerwünschte Trunkierungseffekte haben; Weitere Informationen finden Sie im Abschnitt Anwendungsnutzung von http://pubs.opengroup.org/onlinepubs/9699919799/functions/freopen.html. Für was es wert ist, denke ich, dass dieser Text falsch ist; Wenn der neue Dateiname NULL ist, gibt es keine zugrundeliegende 'open'-Operation und somit gilt der Text über' O_TRUNC 'nicht. –

+0

@R .. Sie können nicht 'freopen' mit einem' NULL' Dateinamen in Windows verwenden, wird es den ungültigen Parameter-Handler entsprechend aufrufen: http://msdn.microsoft.com/en-us/library/wk2h68td.aspx und das Standardverhalten des ungültigen Parameterhandlers besteht darin, die Anwendung zum Absturz zu bringen. – Vargas

5

Sie so etwas tun kann (die Art von Cross-Plattform ist):

FILE *const in = fdopen(dup(fileno(stdin)), "rb"); 
FILE *const out = fdopen(dup(fileno(stdout)), "wb"); 
/* ... */ 
fclose(in); 
fclose(out); 

Oder Sie write() und read() Systemaufrufe direkt mit fileno(stdin) und fileno(stdout) verwenden können. Diese Systemaufrufe arbeiten auf einer niedrigeren Ebene und führen keine Konvertierungen durch. Aber sie haben auch keine Pufferung, die Sie von FILE Streams bekommen.

+0

Der Teil über 'write()' scheint falsch zu sein, ich bekomme immer noch Newline-Konvertierungen, die es verwenden –

+0

Höchstwahrscheinlich verwenden Sie nicht den Systemaufruf 'write()', der 'man -s 2 write' ist. Auf dieser Ebene gibt es keine Text-/Binärmodi. –

Verwandte Themen