C语言 printf on Linux vs Windows



这里有一些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编写程序。

最新更新