c - stdout 必须是文本流吗?

标签 c stdout

我在 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

供引用:在 2011 年的 C 标准修订版中,这已被原封不动地移动到 7.21.3 (7).2

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

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

关于c - stdout 必须是文本流吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29354228/

相关文章:

c - 添加到字符串开头的额外字符?

c - librtmp 免费 () : invalid pointer

c++ - 我可以创建一个没有文件的句柄吗?

c - 使用带有随机端口的套接字将客户端绑定(bind)到服务器

c - 将字符串的 CSV 文件解析为二维字符串数组

c++ - 如何将 win32 CHAR(char) 类型转换为标准字符串?

Python 记录到标准输出和 StringIO

Docker、Tomee、日志记录、标准输出、AWS

.net - 使用 .net 从子进程重定向标准输出

shell - stdout 是否存储在文件系统或内存中的某个位置?