为什么将fprintf与stdout或stderr一起使用时,输出顺序与调用顺序不同



我的环境是Debian GNU/Linux 11。

参数为stdoutstderrfprintf函数给出了意外的输出顺序。

int main() {
std::cout << "Hello, World!" << std::endl;
fprintf(stderr, "22222n");
fprintf(stdout, "111n");
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 

关于①/②的两个输出日志,我不明白。

我认为日志③是对的,但它没有出现,这让我感到奇怪。

输出never类似②,因为到stderr的输出没有缓冲,所以22222将立即刷新,并且会在任何其他数字之前。stdout的输出可能是行缓冲(Linux上的默认值(或

全缓冲输出也不应该像①一样,因为您已经在第一行中使用std::endl进行了刷新,因此Hello, World!将首先打印。这就是为什么永远不要使用std::endl,除非你真的知道它在做什么。始终使用std::cout << "Hello, World!n";。参见";std::endl";vs";\n〃;

③ 应该是正确的输出,因为在Linux上,它会对每条语句进行刷新,而在Windows上,对stdout的最后3次写入在结束时同时刷新

Hello, World!
22222
111
3333 
44444

如果有任何差异,那么您的stdlib 存在一些问题

默认情况下,遗留流和C++流也是同步的,因此可以混合使用这两种类型的流,但会带来一些性能损失。你可以像这个一样禁用它

std::ios::sync_with_stdio(false);

为了获得更好的性能,但现在Hello, World!字符串可以在的任何地方打印

最新更新