linux 如何清空缓冲区

最近要开始做项目,但是有个缓冲区清空问题总搞不掉,解决后分享一下

看到网上好多人说 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 有一点是需要注意的
它只能刷新输出缓冲区.

输入缓冲区只能读取,而不能刷新.

 可能这就是fflush() 背锅的原因.........

二. setbuf(stdin,NULL)
在网上查了一下,好多人都推荐使用 setbuf.为了避免没用 ,我就做了个测试

#include

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

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 也可以清空.

你可能感兴趣的:(linux)