各位高手,这算不算c++ io库的一个bug

C++语言 码拜 5年前 (2016-05-06) 673次浏览
C++标准IO库有几个条件状态,
badbit(用于指出被破坏的流)
failbit(用于指出失败的io操作)
eofbit(用于指出流已经到达文件结束符)
相应的io库提供了几个对应的函数来检测以上状态
bad(),fail(),eof()
假如流处于正常状态,good()函数返回true,但是在实际的测试过程中,
即使流的good()函数返回ture,还是有可能无法正确的接收输入,问一下这是为什么?
–code begin–
#include <iostream>
using namespace std;
int main(int argc,char **argv){
int ival=0;
cin>>ival;
cout<<“first input:”<<ival<<endl;
cin.clear();
if (cin.good())
{
cin>>ival;
cout<<“second input:”<<ival<<endl;
}
return 0;
}
–code end–
程序需要一个int型的输入,假如两次均正确输入了int型,结果正确:
–result begin–
549
first input:549
763
second input:763
请按任意键继续. . .
–result end–
但是假如第1次没有正确输入int型,而是输入了string类型,则第2次的“cin>>ival”直接被忽略。
–result begin–
hello
first input:0
second input:0
请按任意键继续. . .
–result end–
以上代码,分别在vs2008和gcc中进行了编译,运行结果一致,请高手指点。
解决方案

20

cin.clear()只是重置了标志位
cin.sync()才是清除缓冲区,在第二个cin前加一个 cin.sync()就可以了

20

你写一个例子测一下就知道了,它是把标志位设置成参数一样的,而不是清除那一位,可以用下面的测试代码

cout << ( cin.rdstate( ) & ios::badbit ) << endl;
	cout << ( cin.rdstate( ) & ios::failbit ) << endl;
	cout << ( cin.rdstate( ) & ios::eofbit ) << endl;
	cout << ( cin.rdstate( ) & ios::goodbit ) << endl;
	cin.clear(istream::failbit);
	cout << ( cin.rdstate( ) & ios::badbit ) << endl;
	cout << ( cin.rdstate( ) & ios::failbit ) << endl;
	cout << ( cin.rdstate( ) & ios::eofbit ) << endl;
	cout << ( cin.rdstate( ) & ios::goodbit ) << endl;

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明各位高手,这算不算c++ io库的一个bug
喜欢 (0)
[1034331897@qq.com]
分享 (0)