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

文件的处理方法
缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区,
非缓冲文件系统:由用户自己为使用的文件开辟内存缓冲区
缓冲文件系统:不管是读文件还是写文件:数据都是先存放在内存缓冲区的,
当写文件的时候,如果内存缓冲区没有满,程序结束运行,可能使得缓冲区内的数据丢失
这个时候要用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‘作为结束的标志,因为键盘输入流是行缓冲模式

时间: 2024-12-07 02:36:53

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

NHibernate之映射文件配置说明(转载1)

源博客:http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为全限定名.假若没有指定,表名就不会使用全限定名.default-cascade 指定了未明确注明cascade属性的.Net属性和集合类.Net会采取什么样的默认

NHibernate之映射文件配置说明(转载3)

十二.组件(component), 动态组件(dynamic-component) <component>元素把子对象的一些元素与父类对应的表的一些字段映射起来. 然后组件可以定义它们自己的属性.组件或者集合. <component name="PropertyName" (1) class="ClassName" (2) insert="true|false" (3) upate="true|false"

字节流复制mp3文件(带缓冲区)

//自定义的缓冲区 import java.io.*; class  MyBufferedInputStream{    private byte[] buf = new byte[1024]; private InputStream in;        private int pos = 0, count = 0; MyBufferedInputStream(InputStream in){        this.in = in;    }        /*        一次读一个字节

ASP.NET文件组成(转载于Owen的BLOG)

一.扩展名: .aspx:窗体文件,为前台程序. .cs文件:类文件,主要为后台数据处理,供所有的.aspx文件的后台应用. .asmx文件:用于创建从其他应用程序使用的web服务的类. .css文件:样式表单,设置界面的整体风格. 二.特殊文件夹: App_Browers:包含标识个别浏览器,并确定其功能的浏览器定义(.browser). App_Code:App_Code 目录中的所有代码文件都将在运行时动态编译,然后提供给应用程序.(建立全站的通用类,打开网站时即时编译App_Code文件

WebStorm: 更改默认的文件模板(转载)

WebStorm: 更改默认的文件模板(转载) 27 AUGUST 2015 在使用WebStorm进行Web开发时,新建HTML文件后,WebStorm会根据默认模板在该HTML文件中填充以下内容: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <b

文件输入流 FileInputStream类 文件输出流FileOutputStream ---转载

转载自---http://blog.csdn.net/hguisu/article/details/7418161 111:文件输入流: FileInputStream可以使用read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至一个byte数组,byte数组的元素有多少个,就读入多少个字节.在将整个文件读取完成或写入完毕的过程中,这么一个byte数组通常被当作缓冲区,因为这么一个byte数组通常扮演承接数据的中间角色. 作用:以文件作为数据输入源的数据流.或者

内存映射文件原理探索(转载)

转载:http://blog.chinaunix.net/uid-20761674-id-3072683.html 一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了...下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内存映射就很明朗了. 原理 首先,"映射"这个词,就和数学课上说的"一一映射"是一个意思,就是建立一种一一对应关系,在这里主要是只 硬盘上文件 的位置与进程

C语言头文件的使用(转载)

C语言头文件的使用 ——by janders 转载请注名作者和出处,谢谢! 原文:http://blog.csdn.net/janders/article/details/611081 C语言中的.h文件和我认识由来已久,其使用方法虽不十分复杂,但我却是经过了几个月的“不懂”时期,几年的“一知半解”时期才逐渐认识清楚他的本来面目.揪其原因,我的驽钝和好学而不求甚解固然是原因之一,但另外还有其他原因.原因一:对于较小的项目,其作用不易被充分开发,换句话说就是即使不知道他的详细使用方法,项目照样进行

rsync 精确同步文件用法 (转载)

-- include-from 指定目录下的部分目录的方法: include.txt: aa bb ss Command: rsync -aSz  --include-from=/home/include.txt --exclude=/* /home/mnt/data/upload/f/ [email protected]:/mnt/data/upload/f/ --exclude-from 排除目录下的部分目录的方法: exclude.txt: cc dd Command: rsync  -a