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 国际许可协议进行许可。 https://blog.csdn.net/yinaoxiong/article/details/53999623

缓冲区

什么是缓冲区 一个缓冲区对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里数据可被存储并在之后用于检索。缓冲区像前篇文章讨论的那样被写满和释放,对于每个非布尔原始数据类型都有一个...
  • zhangyuan19880606
  • zhangyuan19880606
  • 2016-04-15 15:30:51
  • 1875

键盘输入缓冲区与scanf()原理

键盘输入缓冲区与scanf()原理。键盘缓冲区用来缓存“按键”的ASCII码,而scanf()每次从键盘缓冲区中读取一个字符(ASCII码),直到键盘缓冲区为空。如果键盘缓冲区为非空状态,执行scan...
  • fxwzzbd
  • fxwzzbd
  • 2008-06-05 15:01:00
  • 8544

什么是缓冲区?

缓冲区, 说白了, 就是一个中介。 比如你要租一个房子, 刚好房子的主人也要出租房子, 你们可以直接联系, 但问题就在于: 房子的主人可能没有时间和你扯太多, 你也没有时间和房子的主人扯这扯那, 这个...
  • stpeace
  • stpeace
  • 2014-12-12 23:04:37
  • 3665

C语言中的缓冲区的理解

从一个简单的例子开始: #include int main() { char a[20] ; char str[20] ; printf("请输入文件名:") ; scanf("%s" ,...
  • bobopeng
  • bobopeng
  • 2013-11-18 21:54:21
  • 3826

进程缓冲区和内核缓冲区

我们在学习C语言的时候经常会使用到printf和scanf输出输入,printf输出的时候有时候要清空缓冲区,避免把之前残留的内容打印,scanf在读取输入出现不匹配的时候会把字符重新放回缓冲区,也会...
  • u010590568
  • u010590568
  • 2017-02-03 17:58:08
  • 1192

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

缓冲区有时也被称作缓存,和手机app中存在的缓存类似,它存在的目的也为了提高效率。c语言在对一个文件进行操作的时候,先将文件读取到缓冲区,然后对文件的操作都在缓冲区进行,操作完成了之后才将文件写入磁盘...
  • yinaoxiong
  • yinaoxiong
  • 2017-01-04 00:06:59
  • 1348

C语言清空缓冲区

看下面一个例子: [cpp] view plain copy   #include    int main()   {       int nu...
  • qq_35212671
  • qq_35212671
  • 2016-11-20 22:22:03
  • 5477

C++编程中对缓冲区的理解

什么是缓冲区缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出...
  • yiruirui0507
  • yiruirui0507
  • 2010-11-28 17:43:00
  • 6014

【C】C语言输入输出缓冲区

1.一个“诡异”的程序先来看一个小程序,分析一下运行结果#include int main() { printf("hello"); int i = 0; ...
  • ww1473345713
  • ww1473345713
  • 2016-06-19 18:57:33
  • 3502

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

导读:对C语言输入输出流和缓冲区的深入理解,C语言缓冲区(缓存)详解,缓冲区又称为缓存,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,缓冲区根据其对应的是输入设备还是输出设备,分...
  • SHRDLU
  • SHRDLU
  • 2015-10-06 10:08:17
  • 11824
收藏助手
不良信息举报
您举报文章:c语言笔记——对缓冲区的理解
举报原因:
原因补充:

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