在C语言中,我们常常需要去清空缓存区,对于缓存区清空的重要性,接下来我们进行具体的说明。

首先我们先解释一下缓存区。

1.缓存区

C语言中的缓冲区又称为缓存,它是内存空间的一部分。

也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。

C语缓冲区分为三种类型:1、全缓冲 2、行缓冲 3、不带缓冲。

缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。

例如,在我们平时要在磁盘中读取信息的情况下,先会把数据放到缓存区中,读取完后,再次从磁盘中读取信息。

缓存区,他的意义就是在高速CPU与低速的设备之间的一个区域,这个区域让CPU工作效率更高。

1) 全缓冲

当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。

2) 行缓冲

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

3) 不带缓冲

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

大部分系统默认使用下列类型的缓存:

标准出错是不带缓存的。

如果是涉及终端设备的流,则它们是行缓存的,否则是全缓存的。

我们经常用到的输入输出流,在目前的ANSI C 中缓存的特征是:stdin和stdout是行缓存;而stderr是无缓存的。

了解了这些,接下来我们进入正题,接下来我们要清楚为什么要清空缓存区,

这是因为在你有的时候在输入一个字符后,在输入一个字符,如果你不清空缓冲区,那上一个字符还在你的缓冲区内!这样就造成错误了!

2.清空缓存区

所以我们要对缓存区清空是很重要的,在这里我们给出了下面三种办法来实现:

使用fflush()函数

fflush()函数冲洗流中的信息,该函数通常用于处理磁盘文件。清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时。fflush()函数包含在stdio.h头文件中。

函数原:int fflush(FILE *stream),在这里的stream就是所要清除缓存区的文件。

函数的返回值:当进行刷新成功返回0,失败返回EOF。没有缓冲区或者只读打开时也返回0值。还有需要注意的是:如果fflush返回EOF,数据可能由于写错误已经丢失。

用法示例:fflush(stdin)刷新标准输入缓冲区,fflush(stdout)刷新标准输出缓冲区。 printf(“。。。。。。。。。。。”);后面加fflush(stdout);可提高打印效率

代码示例:

#include

#include

int main()

{

int num;

char a;

scanf("%d", &num);

a = getchar();

printf("num=%d,a=%c\n", num, a);

system("pause");

return 0;

}

在执行这个程序的时候我们会发现,在我们输入第一个字符后敲击‘\n’之后,程序就结束了,这是因为我们没有清空缓存区,getchar()函数接收的是‘\n’,最后造成了程序的停止。

接下来我们来使用fflush()函数。

#include

#include

int main()

{

int num;

char a;

scanf("%d", &num);

fflush(stdin);

a = getchar();

printf("num=%d,a=%c\n", num, a);

system("pause");

return 0;

}

我们在这里可以看到,当使用了fflush()函数对输入流进行清空缓存区以后,就可以正常让getchar函数接收字符。

接下来是第二种方法。

使用while((ch = getchar()) != ‘\n’ && ch != EOF);语句

这种方法是最好的方法,可以称为万能清空缓存区御语句。

代码示例:

#include

#include

int main()

{

char c1 = 0;

char c2 = 0;

scanf("%c", &c1);

c2 = getchar();

printf("c1=%d,c2=%c", c1, c2);

system("pause");

return 0;

}

在这里我们依然没有清空缓存区,得到的效果是这样的,getchar()函数依然接收了’\n’,造成程序停止。

接下来,我们使用while((ch = getchar()) != ‘\n’ && ch != EOF);语句

#include

#include

int main()

{

char c1 = 0;

char c2 = 0;

int ch;

scanf("%d", &c1);

while ((ch = getchar()) != EOF && ch != '\n')

{

;

}

c2 = getchar();

printf("c1=%d,c2=%c", c1, c2);

system("pause");

return 0;

}

加入了while ((ch = getchar()) != EOF && ch != ‘\n’);语句,完成了清空缓存区

事实上有时我们会将这个语句封装在一个函数中,这样会让程序的可移植性更强。

#define CLEAR_BUF \

{\

int ch; \

while ((ch = getchar()) != EOF && ch != '\n')\

{\

; \

}\

}

#include

#include

int main()

{

char c1 = 0;

char c2 = 0;

scanf("%d", &c1);

CLEAR_BUF

c2 = getchar();

printf("c1=%d,c2=%c", c1, c2);

system("pause");

return 0;

}

依然可以达到我们要的效果。

setbuf()函数关闭缓存区

接下来我们要说另外一种清空缓存区的方法,与其说是清空缓存区,不如说他是关闭缓存区。

setbuf()函数

是linux中的C函数,主要用于打开和关闭缓冲机制。包含在头文件stdio.h中。

setbuf函数具有打开和关闭缓冲机制。为了带缓冲进行I/O,参数buf必须指向一个长度为BUFSIZ的缓冲区。通常在此之后该流就是全缓冲的,但是如果该流与一个终端设备相关,那么某些系统也可以将其设置为行缓冲。为了关闭缓冲,可以将buf参数设置为NULL。

函数原型:void setbuf(FILE *stream,char *buf);一个参数是文件流,一个参数是buf指向的缓冲区长度,这个长度就是在stdio.h中定义的宏BUFSIZ所决定的。当定义buf为空时,setbuf函数将使的文件I/O不带缓冲。

#include

#include

char outbuf[50];

int main(void)

{

/* 将outbuf与stdout输出流相连接 */

setbuf(stdout, outbuf);

/* 向stdout中放入一些字符串 */

puts("This is a test of buffered output.");

puts("This output will go into outbuf");

puts("and won't appear until the buffer");

puts("fills up or we flush the stream.\n");

/* 以下是outbuf中的内容 */

puts(outbuf);

/*刷新流*/

fflush(stdout);

system("pause");

return 0;

}

c语言清除文件缓存区,C语言之清空缓存区相关推荐

  1. Html静态页面缓存问题,解决缓存更新不及时需清空缓存更新页面

    问题 在写静态网站的时候,经常回面临某些页面上传更新后,查看时会出现没有更新的清空,就是因为浏览器读取了缓存造成的,需要清空缓存刷新才可以看到页面的更新,但是有些用户不知道这些操作.就很头痛 浏览器缓 ...

  2. c语言采用文件存储数据,C语言读写文件大全 之 基础篇

    一直想着把C语言和C++关于文件操作的相关内容总结一下,这样在使用的时候就可以顺手拈来,嗯,这就是好记性不如烂笔头.既然是文件操作,那么开篇就从"文件"的介绍开始. 1.文件 文件 ...

  3. c语言清除键盘缓冲区函数,C语言程序中清除键盘缓冲区的方法

    第四期2006年12月益阳职业技术学院学报 JournalofYiyangVocationalandTechnicalCollegeNO.4Dec.2006 C语言程序中清除键盘缓冲区的方法 杨长虹 ...

  4. C语言layout文件有用吗,C语言内存模型 (C memory layout)

    一. 内存模型 1. .text 代码区(code section).由编译器链接器生成的可执行指令,程序执行时由加载器(loader)从可执行文件拷贝到内存中.为了安全考虑,防止别的区域更改代码区数 ...

  5. c语言文件打开方式字符串,C语言打开文件-C语言打开文件的方式-C语言以只读方式打开文件-C语言以读写方式打开文件-嗨客网...

    C语言打开文件教程 在 在 C 语言中,打开文件使用 fopen C语言fopen函数详解 语法 FILE *fopen(char *filename, char *mode); 参数 参数 描述 f ...

  6. c语言的文件打开模式,c语言文件打开模式 - osc_b2jf5efr的个人空间 - OSCHINA - 中文开源技术交流社区...

    (转载) 在C语言的文件操作语法中,打开文件文件有以下12种模式,如下图: 打开模式 只可以读 只可以写 读写兼备 文本模式 r w a r+ w+ a+ 二进制模式 rb wb ab rb+ (r+ ...

  7. 使用nodejs读取简体语言json文件并生成繁体语言json文件

    有时需要为项目准备不同语言的文件供用户选择,简体和繁体算是常见的需求了. 比如我们有如下的简体中文文件: {"hello":"你好","业务" ...

  8. C语言的文件的写入------C语言

    昨天介绍了C语言的文件的读取,接下来介绍C语言文件的写入. C语言的读取是fgetc(),fgets(),fread()这三个函数. 那么写入肯定就是fputc(),fputs(),fwrite()这 ...

  9. c语言头文件命名规则,C语言头文件规则.doc

    C语言头文件规则.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档所得收 ...

最新文章

  1. 平安智慧城市:与时代同行,坚定数字化之路
  2. 推荐算法炼丹笔记:推荐系统采样评估指标及线上线下一致性问题
  3. mysql-5.6.x半同步复制配置
  4. 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试
  5. kayui进行添加_关于layui 实现点击按钮添加一行(方法渲染创建的table)
  6. 【C语言简单说】三:变量总结ASCII码扩展(5)
  7. 米家扫地机器人充满电需要多长时间_米家扫地机器人充满电后能工作多久?
  8. org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDao is not known to the
  9. 【OpenCV 例程200篇】11. 图像通道的拆分(cv2.split)
  10. 监控PGA最大空间、分配
  11. easyui onclickrow 中获取列名_获取Chrome浏览器历史浏览记录实例
  12. 用html把图片整体往左挪动,网页制作如何让图片从左到右循环移动
  13. WCF+SQL Server 2008 明源售楼系统项目解析
  14. 金仓数据库字段_金仓数据库认证工程师(KCE)考试试题_含答案_
  15. 上榜豆瓣2020年度经管榜,让《重来3》带你逃离内卷、摆脱焦虑
  16. YOLOv6训练时报错解决方法
  17. Jedis使用lua脚本完成令牌桶限流
  18. Python爬取简单网页内容
  19. 【c语言】C语言运动会系统
  20. 一图看清公募基金十年持仓行业变迁

热门文章

  1. Java 文件与字节流操作
  2. FLEAPHP框架的数据库操作
  3. Matplotlib Pyplot
  4. js数组查找最接近_js查找数组所有符合条件数据 js替换数组中的某个元素
  5. matlab水果图片,matlab数字图像处理-----------------水果识别
  6. 1、OpenSearch入门配置
  7. rk3399性能_(三)感知与大脑——5.机器人大脑嵌入式主板性能对比
  8. 08. 路由器的基本配置和Talent配置
  9. 智能清晰锐化磨皮图片处理软件Perfectly Clear 3.8.0.1665 汉化版
  10. MATLAB学习七(二):数组比较sortrows