printf()缓冲区没满,就不会打印到屏幕上。这句怎么理解?
书上说,缓冲区满的时候会刷新并且将内容打印到屏幕;如果没满的话,就不会打印到屏幕上。我单步调试下面的程序,发现一执行一条printf就直接打印内容,跟书上讲的不一样。
这是为什么呢?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("1");
printf("2");
printf("3");
printf("4");
return 0;
}
有人说,在windows中就不行,在linux中就可以。不知道这个说法对不对。
我没有linux系统,你们谁在linux上试过的吗?结果怎么样?
或者,上面那个试法有什么问题吗?
------------------------------------------
PS:新人,请多指教。谢谢!
[解决办法]
LINUX上是在最后一起打印的,printf是在手动刷新缓冲区和缓冲区满,或遇到换行'\n',或程序正常结束时才会打印
[解决办法]
用printf()输出时是先输出到缓冲区,然后再从缓冲区送到屏幕上。
1. 使用fflush(stdout)强制刷新。
2.缓冲区已满。
3.scanf()要在缓冲区里取数据时会先将缓冲区刷新。
4.\n,\r进入缓冲区时。
5.线程结束的时候,如果该线程里也有printf(....);
6. 程序结束时。
[解决办法]
linux 程序退出才会打印
[解决办法]
跟了一下,看到vs文件printf.c中,缓存值就是1.
[解决办法]
上面我说错了。windows下缓存看到是4096.
跟了下---是用vs跟的。
应该是不同的操作系统导致的。windows有设置flag,估计这里就将要输出到屏幕上了
[解决办法]
对的,代码如下:
if (flag) {
if (stream->_flag & _IOFLRTN) {
/* Flush the stream and tear down temp buffering. */
_flush(stream);
stream->_flag &= ~(_IOYOURBUF
[解决办法]
_IOFLRTN);
stream->_bufsiz = 0;
stream->_base = stream->_ptr = NULL;
}
_flag设置了_IOFLRTN就会立即输出,不用等到其他条件满足。
[解决办法]
不是不同,是性能的差别,嵌入式设备的缓冲区通常远小于pc,可能刚打进去一点,就可能被别的玩意儿盖掉了,所以嵌入式做开发带流的函数进行i/o的时候通常一次i/o马上跟fflush()
[解决办法]
你可以百度一下fflush()这个函数帮助你理解这句话.
另外pc上实现这个玩意儿要到进程操作这部分的时候你会遇到的.