Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1613540
  • 博文数量: 245
  • 博客积分: 10378
  • 博客等级: 上将
  • 技术积分: 2571
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-27 08:19
文章分类

全部博文(245)

文章存档

2013年(4)

2012年(8)

2011年(13)

2010年(68)

2009年(152)

分类: C/C++

2009-03-27 08:57:00

在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就是直接对文件进行操作了,

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

阅读(1266) | 评论(0) | 转发(0) |
0

上一篇:sprintf能干什么?

下一篇:pthread_create

给主人留下些什么吧!~~