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

原创 2017年01月04日 00:06:59

  缓冲区有时也被称作缓存,和手机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()这几个函数吧。这里是我在github上的一个博客,感兴趣的可以去看一下哦
  欢迎大家评论,交流。

版权声明:本作品由尹傲雄采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

相关文章推荐

对C语言输入输出流和缓冲区的深入理解

导读:对C语言输入输出流和缓冲区的深入理解,C语言缓冲区(缓存)详解,缓冲区又称为缓存,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,缓冲区根据其对应的是输入设备还是输出设备,分...
  • SHRDLU
  • SHRDLU
  • 2015-10-06 10:08
  • 7135

C语言缓冲区(缓存)详解

缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。 缓冲区根据其对应的是输入设备还是输出设备...

C语言缓冲区(缓存)详解

1.概念 缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。 缓冲区根据其对应的是输入...

c语言里缓冲区的理解

从一个简单的例子开始: [cpp] view plain copy print?#include   int main()  {      char a[20] ...

深入理解C语言----标准I/O小结(缓冲区,I/O函数及其他相关问题)

与文件I/O围绕文件描述符操作不同,标准I/O的操作是围绕

c语言笔记——对scanf()等输入函数的深入理解

输入函数是我们可以说是接触最早的一批函数了,但是如果不注意的话还是会遇到很多问题,所有我把平时遇到的一些问题和想法写下来。肯定会有不对的地方欢迎大家指正。 scanf() scanf()这个函数...

C语言深度解剖(精讲版)——读书笔记4 &&自己的一些理解

第一章 关键字 void关键字 (感言:很多人认为 void无需重视,其实它很重要) 知识点一:void * 则为“空类型指针”,void *可以指向任何类型的数据; void 真正的作用: ...

C语言深度解剖(精讲版)——读书笔记5 &&自己的一些理解

第一章: 关键字 const关键字----或许叫它readonly更合适 const 的缩写:constant  “恒定不变”的意思。也翻译为常量或常数,所以被认为const修饰的值是常量。这种想...

C语言深度解剖(精讲版)——读书笔记6 &&自己的一些理解

第一章: 关键字 最易变的关键字----volatile 说到volatile的易变让我想起了一个星座....你猜才是什么星座?--- 双子座!双子座的人是一个多变性格出了名的; volatil...

C语言深度解剖(精讲版)——读书笔记10 &&自己的一些理解

第三章    预处理   知识点一:预处理指令 预处理名称 意义 #define 宏定义 #undef 撤销已定义过的宏名 #if #e...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)