输入输出缓冲区

今天有一个(妹子),找我看了一段程序,说是奇怪没有输出什么的看了一下,重点部分是这样的.

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的内容也是立即可以显示的

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值