这里有一些C代码:
int i;
printf("This text is printednThis text is not until the for loop end.");
for (i = 5; i > 0; i--)
{
printf("%d", i);
sleep(1);
}
为什么在for
循环开始之前没有打印'n'
之后的其余文本?即使是 for 循环内的 printf 也只在循环结束后打印。如果我在文本末尾放一个'n'
,它会打印,但我不想要新行。
这只发生在 Linux 上,而不是在 Windows 上(只是将 sleep(1( 更改为 Sleep(1000( 并添加了 windows.h(。
它是由输出缓冲引起的。调用 printf 时,不会立即打印输出。它被写入缓冲区,以便在将来的某个时候输出。通常,n
字符会导致缓冲区自动刷新。您也可以手动刷新标准输出缓冲区:
printf("This text is printednThis text is not until the for loop end.");
fflush(stdout);
C 标准未指定 stdout
的缓冲区。但 POSIX 意味着(不要求(通常stdout
在连接到终端时是线路缓冲的,否则是完全缓冲的。
Linux遵循这个POSIX约定,但Windows没有。您可以使用 setvbuf
更改默认行为或使用 fflush
刷新输出,这是 C 标准保证的。
查找setvbuf()
和_IONBF
vs _IOLBF
vs _IOFBF
. 默认情况下,当输出到终端时,输出是行缓冲的(_IOLBF
(。 这意味着仅当包含换行符时,才会显示输出。 _IONBF
是非缓冲的,有时保留用于标准误差(尽管也可以进行行缓冲(。 _IOFBF
是完全缓冲的;在内部缓冲区已满或您显式fflush()
输出(或者,有时,如果您从标准输入读取(之前,输出才会显示。 如果写入管道或文件,输出通常会完全缓冲。
通常,如果您希望及时查看输出,您应该期望使用换行符结束输出 - 尽管基于 Windows 的示例与此相反。 (这是Stack Overflow上的一个常见模因,可以合理可靠地识别何时为Windows编写程序。