stdout 必须是文本流吗?

Is stdout required to be a text stream?

我运行 cygwin/gcc 4.7.3 和 VS 2010 下的以下程序。

#include <stdio.h>

int main()
{
   printf("This is a test.\n");
   return 0;
}

在这些环境下 运行 程序的输出显示 VS 2010 将 stdout 视为文本流。

问题:

  1. stdout必须是文本流吗?
  2. 实现是否可以自由选择是使用文本流还是二进制流 stdout

编辑

如何以二进制方式写入stdout的问题与要求stdout是文本流还是二进制流是不同的

stdout 必须是文本流,stdinstderr 也是如此。来自C99标准,7.19.3(7):

At program startup, three text streams are predefined and need not be opened explicitly -- standard input (for reading conventional input), standard output (for writing conventional output), and standard error (for writing diagnostic output). (...)

(强调我的)1

供参考:在C标准的2011修订版中,这已被原样移动到7.21.3(7)。2

请注意,这意味着这三个流在启动时是文本流。一些平台提供了稍后切换模式的方式,例如Windows下的_setmode

1 只是为了完整起见:stdinstdoutstderr 引用这些流在 7.19 中定义.1 (3).
2脚注1中提到的部分移至C11中的7.21.1(3)。

您可以使用 fwrite()write() 将原始字节流式传输到 stdout,并使用 stdout 的等效文件描述符。例如,这就是压缩工具的工作方式。

stdout 不需要是文本流 - 在重定向的情况下。

所以我猜你的第二个问题的答案是 'yes'。

看看这个 - What is the simplest way to write to stdout in binary mode?