这是一些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)。
答案 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标准所保证的。