缓冲区的概念
ANSIC标准是采用“文件缓冲系统”处理的数据文件的,所谓文件缓冲系统是指系统自动地在内存中为程序 中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据时,会先送到内存中的缓冲区,装 满缓冲区后才一起送到磁盘上。对应的,如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓 冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根 据C编译系统决定的。为了便于理解可以参考下图。
全缓冲
标准I/O库函数往普通文件读写数据时,是全缓冲的。全缓冲碰到换行符也不刷新缓冲区,即只有缓冲区满了才刷新缓冲区。
全缓冲的刷新条件:
行缓冲
标准I/O库函数往在标准输入输出环境(stdout、stdin)输出东西时,是行缓冲的。所谓的行缓冲就是缓冲区碰到换行符的时候才刷新缓冲区。如果不刷新缓冲区,可能无法对文件执行读写操作
行缓存的刷新条件:
无缓冲
在读写文件的时候通过系统调用I/O对文件进行读写数据。这个时候是无缓冲的,即写数据会立马进入文件,读数据会立马进入内存
全缓冲、行缓冲、无缓冲对比总结
全缓冲:我们缓存在缓冲区的东西在缓冲区满的时候,才写入磁盘或者我们调用fflush刷新缓冲区才能写入到磁盘。对于全缓冲,如果我们缓冲区没满,或者我们没有手动刷新缓存,那么缓存区的内容是不能写入到磁盘的。
行缓冲:我们标准输入、标准输出都是采用的行缓存,也就是遇到换行符的时候,才会将缓存区的东西写入到磁盘。
无缓冲:有的时候,我们希望一些内容在第一时间写入磁盘或者显示出来,比如我们显示错误信息的时候,这时候典型的例子比如标准出错,它就是直接显示出错信息,而不会先放入缓存。
通常情况下,我们需要知道的是,在缓冲区满、手动调用fflush、或者程序结束的时候,我们的缓冲区才会得到刷新,并写入磁盘。