【发布时间】:2022-01-15 03:46:48
【问题描述】:
我的环境是 Debian GNU/Linux 11。
带有参数stdout 或stderr 的fprintf 函数给出了意外的输出顺序。
int main() {
std::cout << "Hello, World!" << std::endl;
fprintf(stderr, "22222\n");
fprintf(stdout, "111\n");
printf("3333 \n");
printf("44444 \n");
return 0;
}
我已经运行了很多次,得到了很多不同的结果:
//①
22222
Hello, World!
111
3333
44444
//②
Hello, World!
111
3333
44444
22222
这是什么原因? 或者,我想了解现象,需要什么知识?
据我了解,输出日志应该是这样的:
//③
Hello, World!
22222
111
3333
44444
关于①/②的两个输出日志,没看懂。
我认为日志③是对的,但它没有出现,这让我感到奇怪。
【问题讨论】:
-
the code only output like ② , but appear ①是什么意思?并且没有 C/C++ 语言。std::cout在 C 中不存在 -
整洁,但很好的例子说明了为什么你不应该越过溪流。即使在与 Gozer 战斗时。
-
您注意到“22222”是唯一不正常的东西,对吧?那是因为您将其打印到 不同 输出流而不是其他所有输出流,并且不要求两者以与输出相同的顺序打印。还要注意其他一切都井井有条吗?这是因为
std::cout默认“绑定”到 C 标准输出流。如果您断开该连接,您可能会获得更多随机排序。原因可能与流何时刷新有关。 -
如果你想要一个特定的顺序,请确保在重要点刷新流。更好的是,不要混合输出方法。