2013-06-02 15 views
12

Ho cercato di capire il modo migliore per scrivere dati binari su stdout da un programma C. Funziona bene su Linux, ma sto avendo problemi quando compilo su Windows perché "\ n" viene convertito in "\ r \ n".Qual è il modo più semplice per scrivere su stdout in modalità binaria?

Esiste un modo standard per scrivere su stdout in una sorta di modalità binaria che evita la conversione di nuova riga? In caso contrario, qual è il modo più semplice per convincere Windows a smettere di farlo?

Sto utilizzando GCC e MinGW.

+0

Come stai attualmente trasmettendo materiale? –

+1

hai provato a usare 'fwrite' invece di' printf'? – tay10r

+0

Attualmente sto usando fwrite. – jncraton

risposta

18

È possibile utilizzare setmode(fileno(stdout), O_BINARY)

avvolgerla in un ifdef se si desidera mantenere compatibile con Linux.

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

+0

Sembra funzionare. Grazie! Almeno nel mio ambiente, setmode richiedeva un secondo parametro. Ho aggiornato la risposta. – jncraton

+3

'freopen (NULL," wb ", stdout)' può anche essere usato, ed è portatile C. Tuttavia, può avere effetti di troncamento indesiderati; vedere la sezione Uso dell'applicazione di http://pubs.opengroup.org/onlinepubs/9699919799/functions/freopen.html. Per quello che vale, penso che questo testo sia sbagliato; quando il nuovo nome file è NULL, non esiste alcuna operazione di base 'open' e quindi il testo su' O_TRUNC' non si applica. –

+0

@R .. non puoi usare 'freopen' con un nome di file' NULL' in Windows, chiamerà il gestore di parametri non valido in base a questo: http://msdn.microsoft.com/en-us/library/wk2h68td.aspx e il comportamento predefinito del gestore di parametri non valido è quello di arrestare l'applicazione. – Vargas

5

Si può fare una cosa del genere (che è una sorta di multi-piattaforma):

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

Oppure si può usare write() e sistema read() chiamate direttamente con fileno(stdin) e fileno(stdout). Queste chiamate di sistema operano a un livello inferiore e non eseguono alcuna conversione. Ma non hanno anche il buffering che si ottiene dagli stream FILE.

+0

La parte su 'write()' sembra essere sbagliata, ho ancora le conversioni di newline che lo usano –

+0

Molto probabilmente non usi la chiamata di sistema 'write()' che è 'man -s 2 write'. Non ci sono modalità testo/binari a quel livello. –

Problemi correlati