c - 为什么输出的执行顺序不符合预期
问题描述
我正在学习 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.
这是有序的。所以这很奇怪,为什么我得到了不同的结果?(我指的 tut 是https://www.journaldev.com/39049/fflush-in-c)
解决方案
也许在您的实现中,stdout
是unbuffered。检查您的文档。
您可能想尝试setvbuf()
恢复stdout
为line-buffered:例如,setvbuf(stdout, 0, _IOLBF, 1000);
在main()
任何其他使用stdout
.
通常stdout
是line-buffered并且stderr
是unbuffered。
unbuffered:一旦数据可用,操作系统就会将数据从流中发送到设备。
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
推荐阅读
- dynamics-crm - 动态 GUID 到主键的映射
- android - .lite 和 .tflite 格式有什么区别
- python - Keras 自定义激活函数(非训练)
- r - 从 R drake 包中的报告生成触发通知
- dialogflow-es - Actions on Google:请求包含无效参数
- string - 我可以用 make 或 new 在 golang 中制作一个预填充的字符串吗?
- python - 内置操作 Numba 的参数类型错误
- javascript - 传单弹出表单:在弹出表单提交中包含传单 latlong 值
- c# - EF6 不保存更改
- python - Python - 嵌套字典中的最大值键,泛化