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中进行了编译,运行结果一致,请高手指点。
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()就可以了
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;