在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函数包含在stdio.h头文件中。函数原int fflush(FILE *stream)在这里的stream就是所要清除缓存区的文件。函数的返回值当进行刷新成功返回0失败返回EOF。没有缓冲区或者只读打开时也返回0值。还有需要注意的是如果fflush返回EOF,数据可能由于写错误已经丢失。用法示例fflush(stdin)刷新标准输入缓冲区fflush(stdout)刷新标准输出缓冲区。printf(“。。。。。。。。。。。”);后面加fflush(stdout)可提高打印效率代码示例#include#includeintmain() {intnum; char a; scanf(%d, num); a getchar();printf(num%d,a%c\n, num, a);system(pause);return0; }在执行这个程序的时候我们会发现在我们输入第一个字符后敲击‘\n’之后,程序就结束了这是因为我们没有清空缓存区getchar函数接收的是‘\n’,最后造成了程序的停止。接下来我们来使用fflush函数。#include#includeintmain() {intnum; char a; scanf(%d, num); fflush(stdin); a getchar();printf(num%d,a%c\n, num, a);system(pause);return0; }我们在这里可以看到当使用了fflush函数对输入流进行清空缓存区以后就可以正常让getchar函数接收字符。接下来是第二种方法。#include#includeintmain() {charc1 0;charc2 0;scanf(%c, c1); c2 getchar();printf(c1%d,c2%c, c1, c2); system(pause);return0; }在这里我们依然没有清空缓存区得到的效果是这样的getchar函数依然接收了’\n’,造成程序停止。接下来我们使用while((ch getchar()) ! ‘\n’ ch ! EOF);语句#include#includeintmain() {charc1 0;charc2 0;intch;scanf(%d, c1);while((ch getchar()) ! EOF ch !\n) { ; } c2 getchar();printf(c1%d,c2%c, c1, c2); system(pause);return0; }加入了while ((ch getchar()) ! EOF ch ! ‘\n’)语句完成了清空缓存区事实上有时我们会将这个语句封装在一个函数中这样会让程序的可移植性更强。#define CLEAR_BUF \{\intch; \while((ch getchar()) ! EOF ch !\n)\ {\ ; \ }\ }#include#includeintmain() {charc1 0;charc2 0;scanf(%d, c1); CLEAR_BUF c2 getchar();printf(c1%d,c2%c, c1, c2); system(pause);return0; }依然可以达到我们要的效果。接下来我们要说另外一种清空缓存区的方法与其说是清空缓存区不如说他是关闭缓存区。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#includecharoutbuf[50];intmain(void) {/* 将outbuf与stdout输出流相连接 */setbuf(stdout, outbuf);/* 向stdout中放入一些字符串 */puts(This is a test of buffered output.);puts(This output will go into outbuf);puts(and wont appear until the buffer);puts(fills up or we flush the stream.\n);/* 以下是outbuf中的内容 */puts(outbuf);/*刷新流*/fflush(stdout); system(pause);return0; }
C语言之清空缓存区
发布时间:2026/6/14 0:52:13
在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函数包含在stdio.h头文件中。函数原int fflush(FILE *stream)在这里的stream就是所要清除缓存区的文件。函数的返回值当进行刷新成功返回0失败返回EOF。没有缓冲区或者只读打开时也返回0值。还有需要注意的是如果fflush返回EOF,数据可能由于写错误已经丢失。用法示例fflush(stdin)刷新标准输入缓冲区fflush(stdout)刷新标准输出缓冲区。printf(“。。。。。。。。。。。”);后面加fflush(stdout)可提高打印效率代码示例#include#includeintmain() {intnum; char a; scanf(%d, num); a getchar();printf(num%d,a%c\n, num, a);system(pause);return0; }在执行这个程序的时候我们会发现在我们输入第一个字符后敲击‘\n’之后,程序就结束了这是因为我们没有清空缓存区getchar函数接收的是‘\n’,最后造成了程序的停止。接下来我们来使用fflush函数。#include#includeintmain() {intnum; char a; scanf(%d, num); fflush(stdin); a getchar();printf(num%d,a%c\n, num, a);system(pause);return0; }我们在这里可以看到当使用了fflush函数对输入流进行清空缓存区以后就可以正常让getchar函数接收字符。接下来是第二种方法。#include#includeintmain() {charc1 0;charc2 0;scanf(%c, c1); c2 getchar();printf(c1%d,c2%c, c1, c2); system(pause);return0; }在这里我们依然没有清空缓存区得到的效果是这样的getchar函数依然接收了’\n’,造成程序停止。接下来我们使用while((ch getchar()) ! ‘\n’ ch ! EOF);语句#include#includeintmain() {charc1 0;charc2 0;intch;scanf(%d, c1);while((ch getchar()) ! EOF ch !\n) { ; } c2 getchar();printf(c1%d,c2%c, c1, c2); system(pause);return0; }加入了while ((ch getchar()) ! EOF ch ! ‘\n’)语句完成了清空缓存区事实上有时我们会将这个语句封装在一个函数中这样会让程序的可移植性更强。#define CLEAR_BUF \{\intch; \while((ch getchar()) ! EOF ch !\n)\ {\ ; \ }\ }#include#includeintmain() {charc1 0;charc2 0;scanf(%d, c1); CLEAR_BUF c2 getchar();printf(c1%d,c2%c, c1, c2); system(pause);return0; }依然可以达到我们要的效果。接下来我们要说另外一种清空缓存区的方法与其说是清空缓存区不如说他是关闭缓存区。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#includecharoutbuf[50];intmain(void) {/* 将outbuf与stdout输出流相连接 */setbuf(stdout, outbuf);/* 向stdout中放入一些字符串 */puts(This is a test of buffered output.);puts(This output will go into outbuf);puts(and wont appear until the buffer);puts(fills up or we flush the stream.\n);/* 以下是outbuf中的内容 */puts(outbuf);/*刷新流*/fflush(stdout); system(pause);return0; }