c语言笔记——对缓冲区的理解

Posted by 尹傲雄 on January 4, 2017   

  缓冲区有时也被称作缓存,和手机app中存在的缓存类似,它存在的目的也为了提高效率。c语言在对一个文件进行操作的时候,先将文件读取到缓冲区,然后对文件的操作都在缓冲区进行,操作完成了之后才将文件写入磁盘。 ##缓冲区存在的原因   那么存在这样一个区域的具体原因是什么呢?其实这和计算机的分级缓存机制的原理差不多。最主要的方面就是将cpu释放出来,充分利用cpu的资源。其次因为对内存的操作速度远大于对磁盘的操作速度,这样就提高了效率,同时还减少了对磁盘的读写次数。 ##缓冲区的类型(这里是摘自互联网) 缓冲区 分为三种类型:全缓冲、行缓冲和不带缓冲。

1) 全缓冲 在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。

2) 行缓冲 在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是标准输入(stdin)和标准输出(stdout)。

3) 不带缓冲 也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

ANSI C( C89 )要求缓存具有下列特征: 当且仅当标准输入和标准输出并不涉及交互设备时,它们才是全缓存的。 标准出错决不会是全缓存的。

但是,这并没有告诉我们如果标准输入和输出涉及交互作用设备时,它们是不带缓存的还是行缓存的,以及标准输出是不带缓存的,还是行缓存的。

大部分系统默认使用下列类型的缓存: 标准出错是不带缓存的。 如果是涉及终端设备的流,则它们是行缓存的;否则是全缓存的。

我们经常要用到标准输入输出流,而ANSI C对stdin、stdout和stderr的缓存特征没有强行的规定,以至于不同的系统可能有不同的stdin、stdout和stderr的缓存特征。目前主要的缓存特征是:stdin和stdout是行缓存;而stderr是无缓存的。 缓冲区的大小

如果我们没有自己设置缓冲区的话,系统会默认为标准输入输出设置一个缓冲区,这个缓冲区的大小通常是512个字节的大小。

缓冲区大小由 stdio.h 头文件中的宏 BUFSIZ 定义,如果希望查看它的大小,包含头文件,直接输出它的值即可: printf(“%d”, BUFSIZ);

缓冲区的大小是可以改变的,也可以将文件关联到自定义的缓冲区,详情可以查看 setvbuf() 和 setbuf() 函数。 缓冲区的刷新(清空)

下列情况会引发缓冲区的刷新: 缓冲区满时; 行缓冲区遇到回车时; 关闭文件; 使用特定函数刷新缓冲区。   而前面遇到的问题,就是在stdin这个地方出现了问题。scanf()这个函数属于标准输入,它的缓冲类型是行缓冲,前面的问题就是函数直接获取了输入缓冲区中的的回车。下次再详细的说一下scanf(),gets_s(),getchar(),getche(),getch()这几个函数吧。   欢迎大家评论,交流。