2013-06-02 7 views
12

Я пытался найти лучший способ записать двоичные данные в stdout из программы C. Он отлично работает в Linux, но у меня возникают проблемы при компиляции в Windows, потому что «\ n» преобразуется в «\ r \ n».Каков самый простой способ записи в stdout в двоичном режиме?

Есть ли стандартный способ записи в stdout в каком-то двоичном режиме, который позволяет избежать преобразования новой строки? Если нет, то какой самый простой способ заставить Windows прекратить это делать?

Я использую GCC и MinGW.

+0

Как вы в настоящее время выпускаете материал? –

+1

Вы пытались использовать 'fwrite' вместо' printf'? – tay10r

+0

В настоящее время я использую fwrite. – jncraton

ответ

18

Вы можете использовать setmode(fileno(stdout), O_BINARY)

Заверните его в IfDef, если вы хотите сохранить его совместимы с Linux.

Смотрите также http://msdn.microsoft.com/en-us/library/tw4k6df8(v=vs.80).aspx

+0

Это похоже работа. Благодаря! По крайней мере, в моей среде, setmode потребовал второй параметр. Я обновляю ответ. – jncraton

+3

'freopen (NULL," wb ", stdout)' также может использоваться и переносится C. Однако он может иметь нежелательные эффекты усечения; см. раздел «Применение приложения» в http://pubs.opengroup.org/onlinepubs/9699919799/functions/freopen.html. Для чего это стоит, я думаю, что этот текст неверен; когда новое имя файла NULL, не существует основной операции 'open', и поэтому текст о' O_TRUNC' не применяется. –

+0

@R .. вы не можете использовать 'freopen' с именем' NULL' в Windows, он вызовет недопустимый обработчик параметров в соответствии с этим: http://msdn.microsoft.com/en-us/library/wk2h68td.aspx и поведение по умолчанию недопустимого обработчика параметра - это сбой приложения. – Vargas

5

Вы можете сделать что-то подобное (что-то кросс-платформенный):

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

Или вы можете использовать write() и read() системные вызовы непосредственно с fileno(stdin) и fileno(stdout). Эти системные вызовы работают на более низком уровне и не делают никаких преобразований. Но у них также нет буферизации, которую вы получаете от потоков FILE.

+0

Часть о 'write()' кажется неправильной, я все равно получаю преобразования новой строки, используя ее –

+0

Скорее всего, вы не используете системный вызов 'write()', который является 'man -s 2 write'. На этом уровне нет текстовых/двоичных режимов. –

Смежные вопросы