在二进制模式下写入stdout最简单的方法是什么?

jnc*_*ton 15 c windows binary newline stdout

我一直在试图找出从C程序向stdout写二进制数据的最佳方法.它在Linux上工作正常,但我在Windows上编译时遇到问题,因为"\n"转换为"\ r \n".

有没有一种标准的方法可以在某种二进制模式下写入stdout,避免换行转换?如果没有,让Windows停止这样做的最简单方法是什么?

我正在使用GCC和MinGW.

Jon*_*oni 24

您可以使用 setmode(fileno(stdout), O_BINARY)

如果你想让它与Linux兼容,请将它包装在ifdef中.

另请参阅:https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setmode?view = vs-2017

  • `freopen(NULL,"wb",stdout)`也可以使用,并且是可移植的C.但是,它可能有不必要的截断效果; 请参阅http://pubs.opengroup.org/onlinepubs/9699919799/functions/freopen.html的"应用程序使用"部分.对于它的价值,我认为这个文本是错误的; 当新文件名为NULL时,没有底层的`open`操作,因此关于`O_TRUNC`的文本不适用. (3认同)
  • @Vargas:“NULL”不是“freopen”的无效参数,所以我想说这是 MSVCRT 中的一个错误...... (2认同)

won*_*ice 7

你可以做类似的事情(这是一种跨平台):

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

或者你可以使用write()read()系统直接调用fileno(stdin)fileno(stdout).这些系统调用在较低级别运行,不进行任何转换.但是他们也没有从FILE流中获得的缓冲.