C stdout必须是文本流吗?

C stdout必须是文本流吗?,c,stdout,C,Stdout,我在cygwin/GCC4.7.3和VS2010下运行了以下程序 #include <stdio.h> int main() { printf("This is a test.\n"); return 0; } #包括 int main() { printf(“这是一个测试。\n”); 返回0; } 在这些环境下运行程序的结果表明VS2010将stdout视为文本流 问题: stdout必须是文本流吗 对于标准输出,实现是否可以自由选择是使用文本流还是二进制流 编辑

我在cygwin/GCC4.7.3和VS2010下运行了以下程序

#include <stdio.h>

int main()
{
   printf("This is a test.\n");
   return 0;
}
#包括
int main()
{
printf(“这是一个测试。\n”);
返回0;
}
在这些环境下运行程序的结果表明VS2010将
stdout
视为文本流

问题:

  • stdout
    必须是文本流吗
  • 对于
    标准输出
    ,实现是否可以自由选择是使用文本流还是二进制流
  • 编辑


    如何在二进制模式下写入
    stdout
    的问题与
    stdout
    是要求是文本流还是二进制流不同。

    stdout
    是要求是文本流,就像
    stdin
    stderr
    一样。根据C99标准7.19.3(7):

    在程序启动时,三个文本流是预定义的,不需要显式打开——标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。(……)

    (强调)1

    供参考:在2011年的C标准修订版中,这一点已移至7.21.3(7)。2

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

    1仅为完整起见:
    stdin
    stdout
    stderr
    引用这些流的定义见7.19.1(3)。

    2脚注1中提到的部分在C11中被移动到7.21.1(3)。

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

    stdout
    不一定是文本流,就像重定向一样

    所以我想你的第二个问题的答案是肯定的

    看看这个-

    我可以问一下您是从哪个网站获得此功能的吗?也就是说,通过stdin/stdout传递二进制数据并不是那么不正常(至少在*nix类型的系统上是如此),特别是在shell启动的用于存档和/或压缩/解压缩的命令管道中。我直接从我的C99标准副本中获得此功能。对于二进制输出:在某些平台上,这只起作用,其他平台允许模式切换(例如Windows下的_setmode())。方法是有的,但C标准没有提供它们。请注意,在POSIX系统上,文本流和二进制流之间没有区别。我仍然在POSIX中搜索明确定义的位置,并将返回一个链接;同时:在POSIX规范中间接提到了这一事实,即
    “r”
    “rb”
    (等等)的
    open
    标志等价物之间没有区别,当然,C库是在POSIX调用中实现的。如果底层系统没有二进制/文本流的概念,那么定义它们就没有意义。您可以编写不使用任何C标准I/O的POSIX兼容I/O代码,这两件事永远不会出现。如果重定向指的是
    program\u name>file\u name
    ,C标准仍然说,
    stdout
    在程序启动时是一个文本流。是的,你是对的-在程序启动时它是文本流-我想问题是“它是必需的吗?”。默认情况下,标准输出是一个文本流。与fopen类似,默认情况下,fopen会打开文本流而不是二进制文件。那么这是否意味着fopen需要处理/处理文本流呢?答案是否定的。不必补充,这就是我对问题中“required”的解释——也许R Sahu在我的说法中是“默认情况下”。不,
    fwrite()
    不会将文本流视为二进制。在重要的系统(Windows)上,使用
    fwrite()
    '\n'
    字符写入
    stdout
    仍会导致
    “\r\n”
    写入文件。那么您是说
    fwrite()
    不能用于写入原始字节(“二进制”)的缓冲区吗到标准输出?如果
    stdout
    当前处于文本模式(默认情况下),并且如果系统对文本和二进制进行了有意义的区分,则不会。类Unix系统则不然;文本和二进制文件及模式的处理方式相同。在Windows上,在文本模式下,
    “\n”
    在输出时转换为CR-LF对,在输入时转换为CR-LF对,Ctrl-Z标记文件的结尾;在二进制模式下,这些转换不会发生。其他系统可能具有其他特征。据我所知,Cygwin不是Windows(尽管不完全符合POSIX)。在用于Windows的POSIX兼容库中使用非POSIX Windows结尾会让我非常难过。您是否正在尝试将二进制数据写入标准输出?若然,原因为何?为什么不以二进制模式打开一个文件并写入它?@KeithThompson,不,我没有那样做。我发现自己正在用cygwin对Windows程序的
    stdout
    进行进一步处理,并希望弄清楚会发生什么。