ANSI C 中,IO的缓存方式

在ansi c中,文件的操作往往是通过缓存来完成的,就是在写文件时,不是直接跟文件打交道,而是先通过缓存区,当缓存区存满数据后者接受到flush fflush函数后,才将缓存区的数据写入文件,这与posix c中,直接操作文件是有区别的,posix c,操作是不带缓存,所有的文件操作是直接跟文件打交道,但这样又一些文件,就是内核时间占用太多,导致系统整体效率下降,不是好的方法,我们知道,系统调用是通过特定的入口,进入内核,由用户态到内核态的转换过程,而内核日常要完成很多的管理和任务的调度工作,如果过多的时间放在外部任务上,就会导致系统的正常调度受到影响,而如果使用带有缓存区的文件io操作,就会减少内核时间的占用。现在就ansi  c中的缓存区做一些简要的阐述。

     我们知道,在ansi-c中,对文件的操作是通过指针来完成的, FILE  *fp, FILE类型是一个结构体,记录了文件的很多信息,包括文件的长度、缓存区的大小、缓存区的地址、操作标志等,同FILE 类型的指针 *fp,就可以完成对文件的操作,没读写相应的数据,结构体内部的文件指针也会移动相应的位置,而文件的缓存区是可以人为设定的,设定缓存区可以通过函数 setbuf 和setvbuf 来完成,这两个函数的命令格式为:

         setbuf(FILE  *fp, char *buf);

         setvbuf(FILE *fp, char *buf, int type,unsigned size);

         type的取值:

         _IOFBF         _IOLBF      _IONBF

       三个常量分别表示满缓存区、行缓存区、无缓存。满缓存区只有在缓存区数据写满后才将数据写入文件,同时清空缓存,等来接受其他的数据,行缓存会将接受数据时,如果碰到数据"\0",或者行缓存区结尾,就把数据写入文件,_IONBF,为缓存,直接写入文件。如上,可以归纳如下:如果打开可写文件后,通过fwrite 或之其他的函数写入数据,对与_iofbf,如果缓存区没有存满数据,是不会写入文件的,只有fclose  flush fflush中的任何一个出现,对与_iolbf,如果在写入数据时又换行符出现,或这遇到行结尾,或者碰到上便的三个函数中的一个,就会将数据写入文件,对ionbu就是直接对文件进行操作了,

    在以后的文件操作中,要注意上便的问题,如果采用满缓存区或这行缓存区,虽然可以节省内核时间,但由于数据不能及时的写入文件中,对又跟数据实时性要求高的应用方便,会有问题,

<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(820) | 评论(0) | 转发(0) |
0

上一篇:sprintf能干什么?

下一篇:pthread_create

给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值