为什么在printf语句中没有添加'\n',我无法使用gcc编译器工作?

3
我已经编写了一个类似下面的printf()语句:
printf("hello\n");

当使用Linux的gcc编译器构建时,这段代码可以正常工作。然而,如果我写

printf("hello");

打印内容未出现在屏幕上。似乎有一些缓冲机制?有人能给我更多信息吗?

3个回答

14

尝试使用fflush()调用。通常向屏幕或文件写入数据非常昂贵,因此数据会被缓存直到需要写入。一般来说,一个 \n 就足够了(缓冲区通常只是存储一行),但如果您需要刷新缓冲区,请使用该刷新调用。


特别是,fflush(STDOUT)将刷新printf使用的标准输出流。 - Nate Kohl
2
记住,孩子们,stdout默认是有缓冲的,而stderr不是。 - paxdiablo
2
顺便提一下,fflush(NULL)会刷新所有打开的缓冲区。 - gbjbaanb
1
默认情况下,当stdout指向终端时,它是行缓冲的。(否则我认为是块缓冲) - Hasturkun

7
即使缓冲不是问题,如果你没有打印换行符,你的shell提示可能会覆盖输出。
我不确定你在哪个环境中运行这个程序,但是如果你例如在unix shell中使用gcc,并在程序末尾执行printf("hello"),它不会在显示你的shell提示之前打印一个换行符。该提示将在同一行上打印,有时会根据您设置的提示类型覆盖整行。

只有在其中有回车符的那些异常情况下才会这样。 - paxdiablo
是的,即使没有回车符,提示符也会显示在输出的最后一行附加到上面,这样对于一个不太注意的人来说,就好像什么也没有被打印出来一样。当然,我并不承认以前我是那么不细心 咳咳 - Andre Miller

2

我在这里发布了关于Windows上无缓冲IO的问题:链接

但它实际上是使用标准的C函数调用setvbuf来实现的。

setvbuf(stdout, (char *)NULL, _IONBF, 0); //unbuffered stdout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接