Linux vs Windows上的printf

时间:2013-08-27 00:42:26

标签: c linux windows printf

这是一些C代码:

int i;
printf("This text is printed\nThis text is not until the for loop end.");
for (i = 5; i > 0; i--)
{
    printf("%d", i);
    sleep(1);
}

为什么在'\n'循环开始之前for未打印之后的其余文本?甚至for循环中的printf也仅在循环结束后打印。 如果我在文本的末尾添加'\n',则会打印,但我不想要换行。

这只发生在Linux而不是Windows上(只是将睡眠(1)改为睡眠(1000)并添加了windows.h)。

3 个答案:

答案 0 :(得分:3)

这是由输出缓冲引起的。当您调用printf时,不会立即打印输出。它被写入缓冲区以便将来某个时间输出。通常,\n字符会导致缓冲区自动刷新。您也可以手动刷新stdout缓冲区:

printf("This text is printed\nThis text is not until the for loop end.");
fflush(stdout);

答案 1 :(得分:1)

查找setvbuf()  和_IONBF vs _IOLBF vs _IOFBF。默认情况下,当输出到终端时,输出是行缓冲的(_IOLBF)。这意味着只有在包含换行符时才会显示输出。 _IONBF是非缓冲的,有时保留用于标准错误(尽管也可以行缓冲)。 _IOFBF已完全缓冲;在内部缓冲区已满之前,或者您明确fflush()输出(或者,有时,如果从标准输入读取),输出将不会出现。如果您写入管道或文件,通常会完全缓冲输出。

一般情况下,如果您希望及时看到它们,您应该期望使用换行符结束输出 - 尽管如此,基于Windows的示例仍然如此。 (Stack Overflow上的常见模因可以合理可靠地识别何时为Windows编写程序。)

答案 2 :(得分:1)

C标准未指定stdout的缓冲区。但POSIX暗示(不要求)通常stdout在连接到终端时进行行缓冲,否则会完全缓冲。

Linux遵循此POSIX约定,但Windows不遵循。您可以使用setvbuf更改默认行为,或使用fflush刷新输出,这是C标准所保证的。