为什么使用printf和cout的代码没有预期的输出?

时间:2015-04-15 17:51:08

标签: c++ compilation output

我有以下代码:

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编译器

5 个答案:

答案 0 :(得分:10)

对此的一种可能解释是coutprintf使用单独的缓冲区。当使用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::coutprintf,则需要使用:

std::ios_base::sync_with_stdio(true);

std::ios_base::sync_with_stdio(false);

http://ideone.com/7sgH2I处查看它。

答案 4 :(得分:1)

您可能会错过flush() std::coutprintf()对此有不同的行为。 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