码迷,mamicode.com
首页 > 其他好文 > 详细

关于文件的缓冲区(转载)

时间:2015-09-17 01:00:26      阅读:384      评论:0      收藏:0      [点我收藏+]

标签:

文件的处理方法
缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区,
非缓冲文件系统:由用户自己为使用的文件开辟内存缓冲区
缓冲文件系统:不管是读文件还是写文件:数据都是先存放在内存缓冲区的,
当写文件的时候,如果内存缓冲区没有满,程序结束运行,可能使得缓冲区内的数据丢失
这个时候要用fclose()将文件关闭,这样会先把缓冲区内的数据先写入文件
然后关闭文件 撤销文件的信息区和文件的缓冲区 使文件的指针变量和文件没有关联
如果缓冲区还没有满的话,但是数据已经到了结尾,就是没有数据读了
那么缓存区就开始把数据写入文件或者读取到程序
数据到末尾,可以使用feof()函数来判断 可以判断任何输入输出流


setvbuf()的用法:
setvbuf:使用自己指定的数组作为文件的缓冲区
setbuf(FILE *fp,char *buf);
setvbuf(FILE *fp,char *buf,int mode,int size);
buf:是字符数组,也就是指定的缓冲区 可以使用malloc()来分配
mode:缓冲的模式:
_IOFBF :完全缓冲模式
_IONBF :行缓冲模式
_IONBF :无缓冲模式
setbuf(fp,null);等价于setvbuf(fp,NULL,_IONBF,0);
buf为NULL的时候,size也必须为0
以stdin为例
setvbuf(stdin,NULL,0);
代码:
int main(void){
setvbuf(stdin,NULL,_IONBF,0);
printf("缓冲区的大小:%d\n",stdin->_bufsiz);//大小为2
char ch;
while((ch=fgetchar())!=‘\n‘){
printf("%c",ch);
}
return 0;
}
虽然设置了无缓冲模式,但是缓冲区的大小还是等于2,说明无缓冲模式是双字节缓冲模式
虽然缓冲区大小是2,但是可以在屏幕输入256个字符,
setvbuf(stdin,buf,_IOFBF,BUFSIZ);//BUFSIZ=512
可以在屏幕输入512个字符 如果BUFSIZ=4096就可以输入4096个字符
操作系统是不会允许键盘即输即读字符 当设置无缓冲模式 的时候
会使用操作系统的自己的缓冲区大小是256,对双字节缓冲区进行输入/输出数据
setbuf(fp,buf);的时候,buf必须是BUFSIZ的大小


缓冲模式分类:
完全缓冲模式:当填满了缓冲区的时候才会进行IO操作 比如磁盘的文件操作
行缓冲模式:当输入输出中遇到了换行符的时候才执行真正IO操作,这时输入的字符先存放在缓冲区,
当按下了回车的时候才会进行IO操作,比如键盘输入流 所以在输入的时候,按了回车建的时候
数据才会写入计算机
无缓冲模式:其实是双字节的缓冲模式:


分析无缓冲模式:标准出错情况stderr是典型代表
无缓冲模式其实是双字节的缓冲模式:
FILE结构
int _charbuf;是一个int 类型的数据,应该是把2个字节的数据存入到了这个_charbuf里面了
需要取出来放在缓冲区内(双字节的缓冲区)
假如a, b
0x 00-00 61 62
_charbuf=0x00006162;
char a=_charbuf;
printf("%c",a);//输出 b;
_charbuf>>8
a=_charbuf;//a
printf("%c",a);

代码:
setvbuf(buf,NULL,_IONBF,0);
int flag = 0;
while ((ch=getchar()) != ‘\n‘){
printf("读取的字符是:%c\n", ch);
printf("缓冲区的大小:%d\n", stdin->_bufsiz);
if (flag == 0){
printf("缓冲区的字符是:%c , %d\n", stdin->_charbuf, stdin->_charbuf);
flag = 1;
}
else{
printf("缓冲区的字符是:%c , %d\n", stdin->_charbuf>>8, stdin->_charbuf>>8);
flag = 0;
}
printf("缓冲区未读的字符数:%d\n", stdin->_cnt);
printf("缓冲区的起始地址:%p\n", stdin->_base);
printf("缓冲区的指针当前地址:%p\n", stdin->_ptr);
printf("缓冲区的当前的内容:%c\n", *stdin->_ptr);
printf("\n\n");
}

行缓冲模式:
getchar();
当程序调用getchar(),就等待用户输入字符,用户输入的字符先存放在
键盘的缓冲区内,直到用户按了回车建为止,当用户按了回车键以后,
(回车符也会写入缓冲区内)这个时候,getchar()就会开始从键盘缓冲区内开始读取字符
如果使用循环,或者多个getchar()的话,那么就可以将缓冲区的数据读完
比如:
char ch;
while((ch=getchar())!=‘\n‘){.....}
最后那个字符是‘\n‘ 这也就是为什么书本上都使用‘\n‘作为结束的标志,因为键盘输入流是行缓冲模式

关于文件的缓冲区(转载)

标签:

原文地址:http://www.cnblogs.com/Kevin-Bruce/p/4815008.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!