定义

缓冲区是内存空间的一部分,用于缓冲输入或输出的数据。根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。

类型

缓冲区分为三种类型:全缓冲、行缓冲和不带缓冲。

1.全缓冲

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

2.行缓冲

输入的字符先放入缓冲区,遇到换行符时才进行实际的I/O操作。典型代表是标准输入(stdin)和标准输出(stdout)。

3.不带缓冲

即不进行缓冲,典型代表是stderr,这样可以使得出错信息尽快显示。

大部分系统默认使用下列类型的缓存:标准出错是不带缓存的;涉及终端设备的流是行缓存的;其余为全缓存。

缓冲区的大小

如果用户没有设置缓冲区,系统会默认为标准输入输出设置缓冲区,大小通常为4096字节。这和计算机中的分页机制有关,每个页的大小为4096字节,因此通常情况下,缓冲区的大小会设置为4096字节。

缓冲区的刷新

以下情况会引发缓冲区的刷新:

1.缓冲区满时;

2.行缓冲区遇到换行符;

3.关闭文件;

4.使用特定函数刷新缓冲区。

举例

 #include<stdio.h>
#include<Windows.h>
int main() {
printf("hello");
int i = ;
for (; i < ; i++) {
putchar('a');
Sleep();
}
return ;
}

运行该程序,等待10s后,输出helloaaaaaaaaaa。

这是由于键盘输入是标准的行缓冲,只有遇到换行符或者程序结束后才会输出到屏幕上。

 #include<stdio.h>
#include<Windows.h>
int main() {
printf("hello");
fflush(stdout);
int i = ;
for (; i < ; i++) {
putchar('a');
Sleep();
}
return ;
}

运行该程序,首先输出hello,等待10s后,继续输出aaaaaaaaaa。

这是由于fflush刷新了缓冲区,所以会首先输出hello。

参考

https://www.cnblogs.com/pricks/p/3821832.html

https://blog.csdn.net/ww1473345713/article/details/51713471

C语言缓冲区的更多相关文章

  1. C语言缓冲区清空

    C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列 ...

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

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

  3. C输入输出函数与缓冲区

    #转 对C语言输入输出流和缓冲区的深入理解C语言缓冲区(缓存)详解缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的 ...

  4. C语言字符串的输入输出

    字符串的输出 在C语言中,输出字符串的函数有两个: puts():直接输出字符串,并且只能输出字符串. printf():通过格式控制符 %s 输出字符串.除了字符串,printf() 还能输出其他类 ...

  5. C++ 知识零碎搭建

    全局变量 局部变量 函数不能嵌套定义 C/C++ 变量在将要被使用时定义即可, 不必一开始就声明所有变量 函数的定义与声明的区别 C++常规类型自动类型转换规则 C语言中十六进制和八进制的格式: 二进 ...

  6. C语言清空输入缓冲区的N种方法对比

    转自C语言清空输入缓冲区的N种方法对比 C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int get ...

  7. C语言刷新缓冲区(转载)

    C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列 ...

  8. 关于scanf、getchar、getch、getche缓冲区分析——C语言

    缓冲区 根据数据刷新的时机可以将缓冲区的类型分为:全缓冲.行缓冲.无缓冲 (注意:Windows下的输出设备没有缓冲区,意思是printf是无缓冲的,但是在Linux下printf就是行缓冲的,至于为 ...

  9. C语言清空输入缓冲区的N种方法对比【转】

    转自:http://www.cnblogs.com/codingmylife/archive/2010/04/18/1714954.html C语言中有几个基本输入函数: //获取字符系列 int f ...

随机推荐

  1. c# 中HttpClient访问Https网站

    c# 中HttpClient访问Https网站,加入如下代码: handler = new HttpClientHandler() ;handler.AllowAutoRedirect = true; ...

  2. java:tomcat(负载均衡)nginx的应用配置

    http://mini.eastday.com/mobile/180627012211514.html 1.什么是负载均衡 由于系统各个核心部分随着业务量的提高,访问量和数据流量的快速增长,单一的服务 ...

  3. windows之电脑开机出现 this product is covered by one or more of the following prtents

    电脑开机出现 this product is covered by one or more of the following prtents 有次意外断电后就每次都出现这个提示,然后要等检查完才能进入 ...

  4. [macOS] Mojave10.14 夜神安卓模拟器启动问题

    废话不多说,其它的都有在这里讨论: https://bbs.yeshen.com/forum.php?mod=viewthread&tid=8566 我的最终解决办法是,virtualbox安 ...

  5. sublime快捷方式

  6. ASP.Net Core "The type initializer for 'Gdip' threw an exception"

    ASP.NET Core项目部署在Linux下可能会出现GDI错误 The type initializer for 'Gdip' threw an exception 解决方案:创建 libdl 的 ...

  7. Javascript学习-简单测试环境

    Javascript学习-简单测试环境 在<JavaScript忍者秘籍>2.4测试条件基础知识中,作者给出了一个精简版的assert和assert组的实现,对于初学者而言,这无疑是一个很 ...

  8. SDK?JDK?JDK 下载、安装、配置图文教程

    什么是软件开发工具包(SDK)   开发一个软件,需要经过编辑.编译.调试.运行几个过程. 编辑:使用编程语言编写程序代码的过程. 编译:如上一节所讲,就是将编写的程序进行翻译. 调试:程序不可能一次 ...

  9. GHSpro文件上传

    GHSpro文件上传 文章 GHSpro 文件上传 基本设计图 上传 上传方式的选择 采用iframe 的表单上传 ajaxfileupload <div id="step-2&quo ...

  10. Price Channel Breakout 交易系统简价及源码

    Price Channel Breakout 交易系统简价及源码 既然这个版有交易系统的模型报告,小弟先在这裡野人献曝一下,把目前正在用的系统拿来请大家批评指教一下. ================ ...