关于清除缓冲区的问题

版权声明:吴鹏 https://blog.csdn.net/qq_28311415/article/details/81091827

在自己写图书管理系统项目的时候,遇到了挺多问题的。这个问题比较严重,就是在自己循环增加图书的时候用char c=getchar()
取得是缓冲区字符,因此不知道缓冲区是否还会存在数据。所以有一下几种方法;
   所谓缓冲区,就是字符由键盘输入的时候,先进缓冲区,不会直接进入硬盘,这样相对来说能提高效率,scanf和cin都是从缓冲区去获取数据的。
     以下例子是关于缓冲区的例子:

#include<stdio.h>
void main()
{
        int m;
        fputs("请输入一个数字:",stdout);                    //标准输出到硬盘上
        scanf("%d",&m);
        printf("%d",m);
}

     先介绍一下fputs函数,fgets()函数是从文件中读取数据,fputs函数是将数据写入到文件中。例如:
         

          FILE *fp=fopen("test.txt","w");

          char s1[20]="hello world";

          char *s2="hello C";

   fputs(s1,fp);   // 数组名

          fputs(s2,fp);   //字符指针

         fputs("hello",fp);  //字符串常量

       上面三种用法都是可以的,实质上, C语言中字符串的直接值其实都是指针。
也可以直接用fputs("内容",stdout);将文件输出到屏幕上;

         
      程序运行时如果输入的是一个整数,则会正常scanf从缓冲区获取数据,正常输出。但当输入的不是整数时,scanf函数将不会从缓冲区获取,所以一直无限循环  fputs("请输入一个数字:",stdout); 无限循环下去;
       所以必须要有清除缓冲区的办法;这里介绍几种C++清除缓冲区的办法:
(1)利用fflush(stdin)清除缓冲区
      但是这种方法现在基本被淘汰,fflush(stdin)不是C/C++的库函数,只是延伸函数,所以建议不要使用;
(2)利用setbuf(stdin,NULL):这个函数在我看来比较好用,直接将输入缓冲区清空,但是在我写图书管理系统,用同学的电脑能正常编译,用我的电脑就会出现一点小bug。这个只能说看自己的吧。
            1.stdin:标准输入,即从键盘输入的字符、数字、标点符号等信息。
            2.stdout:标准输出,显示器屏幕显示,或输出到磁盘,或打印机打印出来的信息。
当一个用户进程被创建的时候,系统会自动为该进程创建stdin(=0)、stdoutr(=1)等数据流  
    setbuf()函数还有一点用法;可以利用setbuf()自己建立一个缓冲区;
    #include<iostream>
    using  namespace std;
    void main()
{
      char c;
      char buffer[256];
      setbuf(stdout,buffer);
      while((c=getchar())!=EOF)
     {
           cout<<c<<endl;
      }
}
(3) 利用while((c=getchar())!='\n' && c!=EOF)  来清除缓冲区,这个方法比较不错,就是写的啰嗦;
(4)利用cin.ignore(INT_MAX,'\n')来清除缓冲区,我觉得这个方法是最好的选择,简单。
  下面是我在实验这些函数写的一些代码,方便调试时更容易掌握;

#include <stdio.h>
#include<iostream>
using namespace std;
int main()
{
    char c;
    char ch[10];
    char *p;
    p = ch;
    int i = 0;

    while (i< 2)
    {
        printf("input a char:\n");
        scanf("%c", &ch[i]);
        char c = getchar();
        while (c != '\n')
        {
            cout << c << endl;
        }
        //while ((c = getchar()) != '\n'&&c != EOF);
        //cin.ignore(INT_MAX,'\n');
        setbuf(stdin, NULL);
        i++;
    }
    i = 0;
    while (i<2)
    {
        printf("输入%c\n", *(p++));
        i++;
    }
    return 0;
}



 

猜你喜欢

转载自blog.csdn.net/qq_28311415/article/details/81091827