今天有一个(妹子),找我看了一段程序,说是奇怪没有输出什么的看了一下,重点部分是这样的.
int main(int argc, char **argv)
{
for (int i = 0; i < 10; i++){
printf("%s", "balabala...");
sleep(1);
}
return 0;
}
它运行的情况是这样的,运行后没有输出,只当程序结束的时候才蹦出一大串的balabala…
仿佛间,看到了自己也是在这个问题迷茫了好久,现在写个小文讲讲吧…
我们要知道,我们对机器的输入输出,都是以流的形式存在的(stream)就行我们,流先会被存在内存的某个位置,而不是真正的存在在了磁盘的某个地方,这个叫做缓冲,就像我们写文档一样,时不时的要保存一下,不然停电了就是啥都没有了。
所以,综上,那些balabala哪去了??就是被缓冲了!
因为ISO规定输入缓冲是全缓冲,而当设计终端设备时它是行缓冲的。所以\n相当于一个更新缓冲区的标志,所以上述的程序要是写成
printf("%s", "balabala...\n");
他就可以正常的一行行的输出了!
就是这么简单哈。
这是我们的输出缓冲,输入缓冲也是如此,这样是不是觉得,每条命令都是回车结尾,变得特别合理
那么说到缓冲区,我们只能通过\n来刷新了吗?当然不
下面是linux下,和标准c的用于刷新缓冲区的函数
- 1、int fsync(int fd);
- 2、 int fdatasync(int fd);
- 3、void sync(void);
- 4、 int syncfs(int fd);
- 5、int fflush(FILE *stream); //标准C
这些函数用于在不同情况,对缓冲区的刷新
比如在刚刚的demo里,如果加上fflush(stdin);
这样的话每当运行到这里,就会有回显。
关掉缓冲区
setbuf(stdin,NULL)
这条语句是可是设置缓冲区的大小,后面的参数,是传入的缓冲区的指针,如果传入为NULL,那么就不使用用缓冲区,printf的内容也是立即可以显示的