引言
前段我把键盘丢了,今天我重新买了一个键盘,新键盘拿到手后,旧键盘又被我找到了!我真是……现在呢,我两个键盘它也没多大用,于是我决定把新键盘送给我在北京的好盆友foreb。我现在有两个送键盘的方案:
1.我亲自护送键盘,打车,买机票到北京,然后跑到他家,他在家的话,直接给他,不在家我再等等他,等他回来了给他。给他后我就回学校
2.我走到操场那的韵达快递,键盘往工作人员那一递,得意洋洋地说:我要寄快递!工作人员递给我单子,我美滋滋地填好信息,然后转身回宿舍。
两个方式都可将键盘送到foreb手里(只送键盘,不存在其他活动),大家会选择哪种?一定是第二种吧?
为什么?节省时间和金钱,也就是可以提高你的效率。有自己跑过去送的时间,你都不知道复习了几遍随机过程,有买机票的钱,你估计都能直接给foreb买8个键盘了。对不对?
什么是文件缓冲区?
ANSIC标准采用“缓冲文件系统”处理的数据文件,所谓“缓冲文件系统“是指系统自动地在内存中为程序的每一个正在使用的文件开辟一块文件缓冲区。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区域逐个地将数据送到程序数据区(程序变量等)。
上述过程如下图所示,这也就意味着在程序在与磁盘进行数据交互时,数据并不是直接被传给程序或者磁盘的,而是存在一个中间媒介,这个媒介会把数据先拿到自己手里,时机合适才会将数据交给数据目的地。
那现在,内存与磁盘进行数据交互的过程就好像我给foreb送键盘的过程。内存就是我,磁盘就是foreb,韵达快递就是缓冲区,送键盘就是IO过程,缓冲区有刷新条件,韵达快递也不是你刚付完款,立马给你的键盘安排专机送过去,它也要等快递数目到一定数量后,才会一起送出去。
最后简单粗暴理解一下缓冲区就是:
缓冲区本质是内存里的一段空间(C帮助我们维护)
为什么要有文件缓冲区?
如果没有缓冲区,假设一份代码里有成百上千的IO操作,那么这份代码的运行周期肯定特别长!效率特别低!(原因在于内存与磁盘数据存取速度存在巨大差距)有了缓冲区,事情就变得简单了,数据先往缓冲区里放,然后达到一定条件(刷新条件)再统一送出去,效率杠杠的。同样是一次IO,有缓冲区存在我一次可以在磁盘上存取很多数据,没有缓冲区,我从每个数据都要都要进行一次IO。
最后,就六个字总结一下,缓冲区的存在意义:
提高IO效率
当然缓冲区也有缺点:
有可能导致数据丢失(概率极低),但不能否认这个可能的存在
缓冲区的刷新方式
1.无缓冲(没有缓冲区)
2.行缓冲(扫描缓冲区时,遇见\n
则刷新一次缓冲区)
3.全缓冲(缓冲区写满再刷新)
【注】刷新一次即缓冲区送出一次数据
缓冲区的刷新时机
1.全缓冲:缓冲区空间满则刷新
2.行缓冲:遇\n
则刷新
3.程序退出时进行刷新
4.强制刷新fflush()
5.fclose()
也会强制刷新缓冲区