Chinaunix

标题: 刷新输入缓冲区 [打印本页]

作者: kiffa    时间: 2008-10-06 21:13
标题: 刷新输入缓冲区
初学C++,写了一段代码,本意想实现如下功能:
要求用户输入一个整数,打印其值,若用户输入错误的数据(比如输入字母),则打印一条出错信息,然后让用户重新输入。

代码如下:


现在的问题是:

若用户正确地输入整数,则没有任何问题;但是用户如果输入错误数据,比如输入字母'a',那么程序就会死循环打印出错信息“error,retry”,永远不会让用户进行第二次输入。而我的本意是只打印一次出错信息,然后等待用户第二次输入。

后来我想难道是cin输入缓冲区需要刷新?但到处找也没找到相关信息,于是死马当活马医,在cin.clear()语句后面加了一句cin.get(),结果就可以达到我的目的了,我不清楚的就是为什么会这样?希望大家能够帮我解释一下。难道是编译器的问题吗?

附修改后能正确运行的代码:



cout << "error,retry" << endl;
cin.clear();
cin.get();



作者: tyc611    时间: 2008-10-06 21:50
LZ你不能直接贴代码么?为什么要贴成图片?
作者: tyc611    时间: 2008-10-06 21:52
用ignore函数类似处理:

  1. while(1){
  2.         cout<<"Input x: ";
  3.         cin>>x;
  4.                
  5.         if (!cin) {
  6.                 cin.clear();
  7.                 cin.ignore(numeric_limits<int>::max(), '\n');
  8.                 continue;
  9.         }
  10.         //.....
  11. }
复制代码

作者: honey709    时间: 2008-10-06 22:42
你是水木 跑过来的吧???
作者: kiffa    时间: 2008-10-06 22:56
因为我是用的虚拟机写的代码,不知道如何输出文本,就直接抓图了。

原来还有ignore这个成员函数,我看的书上完全没讲啊,推荐一本比较详细地介绍I/O Stream的书吧。

不过我还是不太明白具体的原因啊。

难道cin是先读取streambuf中的字符,然后判断,如果正确,再移动streambuf的迭代器,如果不正确,就不移动streambuf的迭代器,这样下次cin的时候,依然读取streambuf中旧的字符。也就是用basic_streambuf::sgetc() ,而不是用basic_streambuf::sbumpc()吗?
作者: tyc611    时间: 2008-10-06 23:40
原帖由 kiffa 于 2008-10-6 22:56 发表
因为我是用的虚拟机写的代码,不知道如何输出文本,就直接抓图了。

原来还有ignore这个成员函数,我看的书上完全没讲啊,推荐一本比较详细地介绍I/O Stream的书吧。

不过我还是不太明白具体的原因啊。

...

对的,由于不是指定类型的数据,读操作会失败,输入缓冲区的读指针不会发生移动,所以这种情况一般需要清空输入缓冲区,如我前面给出的代码所示




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2