我有以下代码:
int main ()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
for (int i = 0; i < 3; i++) {
cout << i << " ";
printf("%d ", i);
}
cout << endl;
return 0;
}
此代码的预期输出为:
0 0 1 1 2 2
但是,它打印:
0 1 2
0 1 2
此问题发生在GNU G ++ 4.9.2编译器
中答案 0 :(得分:10)
对此的一种可能解释是cout
和printf
使用单独的缓冲区。当使用cout
命令刷新终端屏幕时,或者如果缓冲区已满(通常为512字节),则在终端屏幕上输出endl
。
我不确定printf
(如果我错了,请随意纠正我),但它也遵循类似的行为。所以会发生的是,在程序结束时,两个缓冲区都被刷新,因此您看到的输出就会实现。
我在我的机器上运行代码(GCC 4.8.1)以及下面的修改
cout << i << " . ";
printf("%d ", i);
我观察到的输出是0 1 2 0 . 1 . 2 .
,这似乎表明printf在我的情况下首先冲洗。我不知道它是否是设计的(在标准的某处提到),或者它是否取决于上下文。
答案 1 :(得分:8)
默认情况下,C stdio函数printf等,并且C ++ io流是同步的,这意味着它们可以互换使用。在代码的开头,您已使用ios_base::sync_with_stdio(false)
删除了同步,不确定您的实际意图是编写此ios_base::sync_with_stdio(true)
来同步两个io库。
答案 2 :(得分:5)
试试这个
cout << i << " " <<std::flush;
printf("%d ", i);
fflush(stdout);
答案 3 :(得分:3)
如果您希望同步输出std::cout
和printf
,则需要使用:
std::ios_base::sync_with_stdio(true);
不
std::ios_base::sync_with_stdio(false);
在http://ideone.com/7sgH2I处查看它。
答案 4 :(得分:1)
您可能会错过flush()
std::cout
。 printf()
对此有不同的行为。 IO缓冲区也应该同步。如果您将代码更改为
int main () {
ios_base::sync_with_stdio(true); // Synchronizing the IO buffers
// must be enabled
cin.tie(NULL);
for (int i = 0; i < 3; i++) {
cout << i << " ";
cout.flush(); // <<<<<<<<<<
printf("%d ", i);
}
cout << endl;
return 0;
}
它应该按照您的预期行事。请参阅工作演示here。