【问题标题】:What does it mean to write to stdout in C?在 C 中写入标准输出是什么意思?
【发布时间】:2025-12-11 05:10:02
【问题描述】:

写入“stdout”的程序是否写入文件?屏幕?我不明白写入标准输出是什么意思。

【问题讨论】:

  • 这意味着它写入文件描述符1。stdout就像一个常量变量名,每个人都使用,所以你不必记住实际的FD编号是1。例如,当我第一次写这个的时候,我以为是 FD 0... :)

标签: c unix stdout


【解决方案1】:

这意味着您正在会话的主输出设备上打印输出……不管是什么。用户的控制台、一个 tty 会话、一个文件或谁知道什么。该设备可能是什么取决于程序的运行方式和位置。

以下命令将写入标准输出设备(stdout)...

printf( "hello world\n" );

本质上,这只是另一种方式......

fprintf( stdout, "hello world\n" );

在这种情况下,stdout 是指向 FILE 流的指针,它表示应用程序的默认输出设备。你也可以使用

fprintf( stderr, "that didn't go well\n" );

在这种情况下,您会将输出发送到应用程序的标准错误输出设备,该设备可能与stdout 相同,也可能不同——与stdout 一样,stderr 是指向FILE 流,表示错误消息的默认输出设备。

【讨论】:

  • C 语言中是否有写入标准输出的命令示例?一个简单的 printf 语句是否写入标准输出?用 write() 写入文件怎么样?
  • printf 默认写入stdout,如果要写入特定流,则应使用fprintf,它接受FILE* 作为目标流。
  • 它也是“标准”输出,因为它被称为“标准”输出。与 stdin 或“标准输入”相反,stderr 表示“标准”错误。
  • 我在这里写了一个关于如何使用fflush(stdout) 强制刷新缓冲区的附录:*.com/a/48551850/4561887
【解决方案2】:

视情况而定。

当您承诺将输出发送到 stdout 时,您基本上是让用户来决定该输出应该去哪里。

如果您使用printf(...)(或等效的fprintf(stdout, ...)),您会将输出发送到stdout,但最终的结果可能取决于我如何调用您的程序。

如果我像这样从控制台启动您的程序,我会在控制台上看到输出:

$ prog
Hello, World! # <-- output is here on my console

但是,我可能会像这样启动程序,但不会在控制台上产生任何输出:

$ prog > hello.txt

但我现在会有一个文件“hello.txt”,其中包含文本“Hello, World!”在里面,感谢 shell 的重定向功能。

谁知道呢——我什至可以连接一些其他设备,然后输出就可以到那里了。关键是当您决定打印到stdout(例如使用printf())时,在您看到进程是如何启动或使用的之前,您不会确切知道它会去哪里。

【讨论】:

    【解决方案3】:

    stdout 是标准输出文件流。显然,它的第一个和默认输出指针是屏幕,但是您可以根据需要将其指向文件!

    请阅读:

    http://www.cplusplus.com/reference/cstdio/stdout/

    C++ 与 C 非常相似,但都是面向对象的。

    【讨论】:

      【解决方案4】:

      stdout 是 UNIX 中的标准输出流。见http://www.gnu.org/software/libc/manual/html_node/Standard-Streams.html#Standard-Streams。 在终端中运行时,您会在终端中看到写入stdout的数据,您可以根据自己的选择进行重定向。

      【讨论】:

        【解决方案5】:

        stdout 代表标准输出流,它是操作系统本身可用于您的程序的流。它与stdinstderr 一起从一开始就可用于您的程序。

        它们指向(或来自)的东西可以是任何东西,实际上流只是为您的程序提供了一个对象,该对象可用作发送或检索数据的接口。默认情况下,它通常是终端,但它可以被重定向到任何你想要的地方:一个文件,一个管道到另一个进程等等。

        【讨论】:

          【解决方案6】:

          @K Scott Piel 写了一封great answer here,但我想补充一点。

          注意stdout 流是usually line-buffered,因此要确保输出被实际打印,而不是仅仅留在缓冲区中等待写入,您必须通过任一结束来刷新缓冲区你的printf 声明带有\n

          例如:

          printf("hello world\n");
          

          printf("hello world"); 
          printf("\n");
          

          或类似的,或者您必须在拨打printf 之后拨打fflush(stdout);

          例如:

          printf("hello world"); 
          fflush(stdout);
          

          在此处阅读更多信息:Why does printf not flush after the call unless a newline is in the format string?

          【讨论】: