【问题标题】:why the execution order of output is not as expected为什么输出的执行顺序不符合预期
【发布时间】:2021-09-19 15:52:06
【问题描述】:

我正在学习 c,但我被教程中的一些代码卡住了。

#include <stdio.h>
 
int main() {
    fprintf(stdout, "This is to stdout. ");
    fprintf(stderr, "This is to stderr. ");
    fprintf(stdout, "This is also to stdout. ");
}

他们得到的结果是

This is to stderr. This is to stdout. This is also to stdout. 

这是不正常的 但我得到的是

This is to stdout. This is to stderr. This is also to stdout.

这是有序的。 所以这很奇怪,为什么我得到了不同的结果? (我指的是https://www.journaldev.com/39049/fflush-in-c

【问题讨论】:

  • 通常stdout行缓冲stderr无缓冲
  • 和标准输出可以设置为无缓冲以立即刷新
  • @KamilCuk 这对我来说完全有道理,但是在执行与上面相同的代码后我得到了不同的结果
  • 你是如何运行程序的?从命令行?直接输出到终端窗口还是发送到管道或文件?
  • @EricPostpischil 由cmd运行,我发现实现中stdout无缓冲的问题。

标签: c stdout stdin fflush


【解决方案1】:

也许在您的实现中,stdout无缓冲。检查您的文档。

您可能想尝试setvbuf()stdout 还原为行缓冲:例如,在main() 的开头使用setvbuf(stdout, 0, _IOLBF, 1000); 在任何其他之前使用stdout


通常stdout行缓冲stderr无缓冲

无缓冲:一旦数据可用,操作系统就会将数据从流中发送到设备。

line-buffered:当达到换行符(或限制)时,数据被发送到设备。

完全缓冲:当缓冲区满时,数据被发送到设备。

fprintf(stdout, "hello"); // "hello" is kept in buffer because no newline
fprintf(stderr, "again"); // "again" is sent to the device immediately
fprintf(stdout, "world"); // "world" is kept in buffer
// ...
return 0;                 // buffer (now containing "helloworld") is sent to the device at program completion

【讨论】:

  • 这不是你的“错”:-) 某些安装(尤其是使用 IDE)会更改 stdout 的默认缓冲模式(可能还有其他流)。
  • 我有另一个问题,为什么我在“你好”之后添加一个换行符后订单没有恢复到“正常”。 (即你好\n)。
  • 也许您的stdout 已完全缓冲。只有当缓冲区(可能是 1K 字节?)已满时,数据才会发送到设备。当流被行缓冲时,换行应该强制数据到设备! 但是在不同的接口之间可能存在不同级别的缓冲,数据必须从您的代码传递到设备(代码、实现、操作系统、设备软件、设备硬件……),并且没有真正的方法来管理所有这些你的 C 代码弄得一团糟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多