最近要开始做项目,但是有个缓冲区清空问题总搞不掉,解决后分享一下
看到网上好多人说 fflush() 没有用,然后就去测试一下
一. fflush
测试代码
int main()
{
while(1)
{
sleep(1);
printf("刷新一次缓冲区");
}
return 0;
}
输出结果:
因为缓冲区没有满,所以暂时什么都不输出
调用 fflush()
int main()
{
while(1)
{
sleep(1);
printf("刷新一次缓冲区");
fflush(stdout);
}
return 0;
}
测试结果: fflush():
结果发现fflush() 是有用的。(但是网上好多都在说fflush() 没有用) 还得是实践出真理。
对于 fflush 有一点是需要注意的
它只能刷新输出缓冲区.
输入缓冲区只能读取,而不能刷新.
可能这就是fflush() 背锅的原因.........
二. setbuf(stdin,NULL)
在网上查了一下,好多人都推荐使用 setbuf.为了避免没用 ,我就做了个测试
#include<stdio.h>
int main( )
{
char ch;
scanf( "%c",&ch);
printf( "ch = %c\n",ch);
setbuf(stdin,NULL);
char ch2;
scanf( "%c",&ch2);
printf( "ch2 = %c\n",ch2);
}
输入 : 123456
输出 : ch = 1
然后他会等待你继续输入
这个测试做完以为 setbuf 真的有用,毕竟是测试了的
但是
在做项目的时候 ,setbuf 有时有用,有时 又失效了.
然后跑去问学长后才知道,setbuf 不是清空缓冲区,而是关闭缓冲区
然后我又做了个测试
#include<stdio.h>
int main( )
{
char ch;
scanf( "%c",&ch);
printf( "ch = %c\n",ch);
setbuf(stdin,NULL);
char ch2;
scanf( "%c",&ch2);
printf( "ch2 = %c\n",ch2);
setbuf(stdin,NULL);
char ch3;
scanf( "%c",&ch3);
printf( "ch3 = %c\n",ch3);
}
输入 : 123456
输出 : ch1 = 1
输入 : 12
输出 : ch2 = 1
ch3 = 2
这个测试做完 我才清楚 为什么 做项目的 时候 setbuf 有时有用,有时没用
只有缓冲取打开的时候 setbuf 才有用,而 当你用了一次setbuf 后,缓冲区就会被关掉,变为无缓冲,这时你再次使用 setbuf 他就失效了.
正解 :
一
古老但好用的
char ch;while((ch=getchar())!= '\n '&&ch!=EOF);
二
fgets :
从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时. 使用 fgets 也可以清空.