输入输出缓存
文章目录
前言
当使用键盘鼠标等输入设备以及显示器等输出设备时,会涉及到缓存,包括全缓存,行缓存以及不缓存
一、为什么使用缓存
在日常使用中,如果没有缓存,那么我们输入数据后会立即显示在输出设备上,虽然这种输出很快,但是并不能输出我们想要的数据,它的输出将会是单字符的形式,那么我们要输出一个完整的字符串就必须多次输出,增加了与输出设备的交互,降低了交互速率
因此我们需要用到缓存来实现减少交互,降低交互过多带来的影响
二、如何使用缓存?
缓存是系统自带,或者说语言自带的,根据不同的方法,会有不同的缓存形式,并不需要我们去关心,我们需要关心的只是在合适的时间地点使用合适的方式方法
三、使用步骤
1.引入库
#include <stdio.h>
#include <windows.h>
#include <unistd.h>
#include <conio.h>
同样还是基础库,我们通过scanf,gets,getch,getcher,printf来查看缓存的影响
注:getch,getcher都属于非标准库,因此需要引入conio.h
2、缓存类型
1、全缓存
当缓存区域内数据量达到一定程度会输出,并清空缓存区域,那么就叫做全缓存,比如写文件
2、行缓存
当遇到换行符时输出,叫行缓存,我们一般开发中用到的都是行缓存,需要用到换行符或者直接回车才会输出
int main(){
char str1[3];
scanf("%s",&str1);
printf("这是行缓冲数据:%s",str1);
}
3、无缓存
无缓存,比如getch以及getche都属于无缓存,输入之后并不需要特殊的字符标识,就立即输出
int main(){
char str;
str = getch();
printf("这是无缓冲数据:%c",str);
}
4、linux平台同window的区别
int main(){
printf("你好啊");
sleep(5);
printf(" 世界");
}
当我们在window下输出时,并没有发现linux下缓存的情形,window会在五秒后直接输出第一个字符串,如图一,但是linux下会发现并没有直接输出第一个字符串,而是在五秒后与第二个字符串一同输出,如图二(因为最后结果是乱码,所以并没有放出最后的图片)
图一
图二
5、清除缓存
1、通过添加 \n 换行符进行输出
int main(){
printf("你好啊 \n");
sleep(5);
printf(" 世界");
}
2、通过正则表达式清除
int main(){
scanf("%*[^\n]");
scanf("%*c"); //在下次读取前清空缓存区
}
注:
在我切换到window系统库的时候也就是MinGW的时候,发现,会出现中文输出乱码,但是输入接收不会乱码的情况
解决方案:C语言使用MinGW出现输出中文乱码