荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: bakey (三日不见,如隔24抽), 信区: Program
标  题: [合集]请问C++中的刷新输入缓冲区的函数
发信站: 荔园晨风BBS站 (2005年09月28日19:18:27 星期三), 站内信件

☆   1  ──────────── 我是分割线 ─────────────────☆
发信人: Dtan (Dtan), 信区: Program
标  题: 请问C++中的刷新输入缓冲区的函数
时  间: 2005年09月17日15:50:50 星期六

正如C语言中的fflush(stdin);语句可以刷新用scanf输入时留在输入缓冲区中的内容,
然而,在C++中这样的函数调用对用cin的输入却是不起作用的。
例如下列程序段:
int request;
do {
      scanf("%d", &request);
      fflush(stdin);
   } while ( request < 1 && request > 4 );
如果scanf后不调用fflush刷新缓冲区,当输入一个字母时,将会陷入死循环,而调用
fflush则可以把留在缓冲区里的字母去掉。
然而,在C++中
int request;
do {
      cin >> request;
      //这里应该调用什么函数才能达到上面一样的效果呢?
   } while ( request < 1 && request > 4 );


☆   2  ──────────── 我是分割线 ─────────────────☆
发信人: bakey (一日不见,如隔生抽), 信区: Program
标  题: Re: 请问C++中的刷新输入缓冲区的函数
时  间: 2005年09月17日20:15:25 星期六

怎么我输入好像没有死循环呢....
c++的话你可以试试cin.clear()
应该可以得到同样效果吧



☆   3  ──────────── 我是分割线 ─────────────────☆
发信人: Dtan (Dtan), 信区: Program
标  题: Re: 请问C++中的刷新输入缓冲区的函数
时  间: 2005年09月19日20:17:36 星期一

不好意思,犯了一个严重错误,while中应用 逻辑或,而不应该用 逻辑与(如果用逻辑与
的话,逻辑表达式的值永远是假,所以无论输入什么值都会结束while循环),更正如下:

do    {
      cout << "Please enter your request: ";
      cin >> request;
      //这里应该调用什么函数才能达到上面一样的效果呢?
      } while ( request < 1 || request > 4 );

加上输出语句是为了让死循环的效果更明显。
还有cin.clear()只是设置goodbit,即设置状态位,并不会刷新输入缓冲区。下面是库函
数的一段代码

void clear(iostate _St = goodbit, bool _Ex = false)
{ios_base::clear(_Sb == 0 ? (int)_St | (int)badbit : (int)_St, _Ex); }

当期望输入一个整数而实际上却输入了一个字符时,goodbit会赋值为0,badbit赋值为4,
运行时_Sb!=0,所以这样调用 ios_base::clear(4, false); 而ios_base::clear 函数不知
道在 VC6.0 库函数里是如何实现的,但从效果来看,即使在上面代码的cin>>request;语
句后加上cin.clear();也是会出现死循环,所以我觉得ios_base::clear 中并没有刷新输
入缓冲区。
结果是,在注释那里应该调用什么函数呢?


☆   4  ──────────── 我是分割线 ─────────────────☆
发信人: bakey (一日不见,如隔生抽), 信区: Program
标  题: Re: 请问C++中的刷新输入缓冲区的函数
时  间: 2005年09月19日20:59:55 星期一

不好意思,我再看看。没遇到过这种问题。我再查查看



☆   5  ──────────── 我是分割线 ─────────────────☆
发信人: MiYear (MiYear), 信区: Program
标  题: Re: 请问C++中的刷新输入缓冲区的函数
时  间: Wed Sep 21 11:49:15 2005

改为如下:
do
 {
       cout << "Please enter your request: ";
       cin >> request;
       cin.clear( );
       cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );  //事先
要在头文件中添加#include <limits>
 }
while ( request < 1 || request > 4 );

另外,fflush这个函数的功能,与编译器关系密切,从提高移植性考虑,最好不要用fflush
这个函数,虽然你一直用它没有出现过问题。


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店