2013-06-02 15 views
12

Próbuję znaleźć najlepszy sposób zapisywania danych binarnych na standardowe wyjście z programu w języku C. Działa dobrze na Linuksie, ale mam problemy podczas kompilacji w systemie Windows, ponieważ "\ n" jest konwertowane na "\ r \ n".Jaki jest najprostszy sposób zapisu na stdout w trybie binarnym?

Czy istnieje standardowy sposób zapisu na stdout w jakimś trybie binarnym, który unika konwersji linii nowej? Jeśli nie, jaki jest najprostszy sposób, aby system Windows przestał to robić?

Używam GCC i MinGW.

+0

W jaki sposób obecnie wysyłasz dane? –

+1

Czy próbowałeś użyć 'fwrite' zamiast' printf'? – tay10r

+0

Obecnie używam fwrite. – jncraton

Odpowiedz

18

Można użyć setmode(fileno(stdout), O_BINARY)

owinąć go w ifdef jeśli chcesz zachować kompatybilny z Linuksem.

Zobacz także http://msdn.microsoft.com/en-us/library/tw4k6df8(v=vs.80).aspx

+0

To wydaje się działać. Dzięki! Przynajmniej w moim środowisku tryb wymagał drugiego parametru. Zaktualizowałem odpowiedź. – jncraton

+3

'freopen (NULL," wb ", stdout)' może być również używany, i jest przenośny C. Jednak może mieć niepożądane efekty skracania; zobacz sekcję Wykorzystanie aplikacji na http://pubs.opengroup.org/onlinepubs/9699919799/functions/freopen.html. Co jest warte, myślę, że ten tekst jest błędny; kiedy nowa nazwa pliku ma wartość NULL, nie ma ukrytej operacji 'open', dlatego tekst o' O_TRUNC' nie ma zastosowania. –

+0

@R .. nie można użyć 'freopen' z nazwą pliku' NULL' w systemie Windows, wywoła to nieprawidłową procedurę obsługi parametrów zgodnie z poniższym: http://msdn.microsoft.com/en-us/library/wk2h68td.aspx a domyślne zachowanie niepoprawnej procedury obsługi parametrów powoduje awarię aplikacji. – Vargas

5

można zrobić coś takiego (co jest rodzajem wieloplatformowym):

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

Albo można użyć write() i układ read() wywołuje bezpośrednio z fileno(stdin) i fileno(stdout). Te wywołania systemowe działają na niższym poziomie i nie powodują żadnych konwersji. Ale nie mają również buforowania, które otrzymujesz ze strumieni FILE.

+0

Część dotycząca 'write()' wydaje się być błędna, nadal uzyskuję konwersje przy użyciu nowej linii, używając jej –

+0

Najprawdopodobniej nie używasz wywołania systemowego 'write()', które jest 'man -s 2 write'. Na tym poziomie nie ma trybów tekst/binarny. –

Powiązane problemy