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 国际许可协议进行许可。

VS2013 调试时读取字符串的字符时出错

在 Debug 模式下,VC 会把未初始化的栈内存上的指针全部填成 0xcccccccc ,当字符串看就是 “烫烫烫烫……”; 会把未初始化的堆内存上的指针全部填成 0xcdcdcdcd,当字符串看就...

VS2015使用 F11逐语句调试

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 快捷键是F11 也可通过点击 调试---逐语句 进行逐语句调试...

零基础学C语言 笔记四 Scanf函数清除缓冲区

Scanf函数清除缓冲区 之前涉及到scanf会先到缓冲区看看是否存在数据,若存在数据,就直接拿缓冲区的数据过来使用,这就涉及到了一个问题,那如果缓冲区的数据不是我想要的呢?             ...
  • yi_zz32
  • yi_zz32
  • 2015年08月22日 15:15
  • 955

C语言——字符I/O与缓冲区

一,简单的C程序的I/O 程序完成:获取从键盘输入的字符并将其发送至屏幕。 #include; int main(void) { char ch; while((ch=getc...
  • msnzt
  • msnzt
  • 2013年03月10日 14:36
  • 421

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

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

c语言里缓冲区的理解

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

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

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

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

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

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

第二章   符号  注释符号 知识点一:几个似是而非的注释问题 C语言的注释可以出现在C语言代码的任何地方,这句话对不?好,我们来从下面的例子分析中找出答案: 例: (a) int /*......

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

第三章    预处理   知识点一:预处理指令 预处理名称 意义 #define 宏定义 #undef 撤销已定义过的宏名 #if #e...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言笔记——对缓冲区的理解
举报原因:
原因补充:

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