C++的一个IO有关问题
C++的一个IO问题?
这是C++ Primer里的一段代码。
但是看代码的愿意,要是我输入整数的时候敲了一个字符进去,它应该输出Failed!以后再提示我Enter,
可是我一旦输入字符,她就不断地Faile! Enter: Failed! Enter:……了
这是怎么回事?
------解决方案--------------------
taodm果然厉害!
为什么要这样加呢?
输入缓冲的清空和输出缓冲的清空, 都可以通过sync()来完成.
cout.sync();
使得所有输出缓冲中的内容被写到标准输出上.
cin.sync();
使得所有输入缓冲中未被读取的内容从此被忽略.
加上cin.ignore()也是可以的。
这是C++ Primer里的一段代码。
但是看代码的愿意,要是我输入整数的时候敲了一个字符进去,它应该输出Failed!以后再提示我Enter,
可是我一旦输入字符,她就不断地Faile! Enter: Failed! Enter:……了
这是怎么回事?
- C/C++ code
int n; while (cout << "Enter: ", cin >> n, !cin.eof()) { if (cin.bad()) throw runtime_error("IO error!"); if (cin.fail()) { cerr << "Failed!" << endl; cin.clear(); continue; } }
------解决方案--------------------
taodm果然厉害!
为什么要这样加呢?
输入缓冲的清空和输出缓冲的清空, 都可以通过sync()来完成.
cout.sync();
使得所有输出缓冲中的内容被写到标准输出上.
cin.sync();
使得所有输入缓冲中未被读取的内容从此被忽略.
加上cin.ignore()也是可以的。
- C/C++ code
//Run on VC2005+WinXPSP2 #include <iostream> using namespace std; int main() { int n; while (cout << "Enter: ", cin >> n, !cin.eof()) { if (cin.bad()) throw runtime_error("IO error!"); if (cin.fail()) { cerr << "Failed!" << endl; cin.clear(); cin.ignore(); continue; } } }
------解决方案--------------------
- C/C++ code
**************************************************************************/ /*有关cin.fail(),cin.clear(),cin.sync的应用*/ /*************************************************************************/ /* int a; cout<<"输入一个字母:"<<endl; cin>>a; //int型变量中放了char型数据,failbit置1 cout<<"cin.fail()="<<cin.fail()<<endl; //输出1 cout<<"输入一个数字:"<<endl; //由于failbit值为1,输入流不能正常工作 cin>>a; //故此处的输入无效 cout<<a<<endl; //输出不确定值 cin.clear(); //此处用cin.clear()流标志复位 cout<<"cin.fail()="<<cin.fail()<<endl; //此处failbit已为0 cout<<"输入一个数字:"<<endl; //但刚才输入的字符并没有从流中清除,所以cin>>a又把那个字符放入a中,流输入流又不能正常工作 cin>>a; cout<<a<<endl; //输出不确定值 cout<<"cin.fail()="<<cin.fail()<<endl; //在此处failbit又为1 cin.clear(); //再次修复输入流 cin.ignore(); //取走刚才流中的字符 cout<<"输入一个数字:"<<endl; //再次接收用记输入,这次输入数字,正常输出了 cin>>a; cout<<"a="<<a<<endl; //现在再看一下输入流的failbit cout<<"cin.fail()="<<cin.fail()<<endl;//输出0,表明输入流已恢复正常 */ /************************************************************************************/ /****************************************************************/ /*switch与case匹配的问题*/ /****************************************************************/ /*第一种处理方法*/ /* int choice=1; while(choice==1) { int which; cout<<"请选择所需要的服务:"; cin>>which; if (cin.fail()) { /////////加这一段 输入错误时(要输入数而输入的是字符。。)不会出现死循环 cout<<"输入错误!"<<endl; cin.clear(); //cin.sync(); cin.ignore(); continue;//终止本次循环 继续下一次循环 } switch(which) { case 1: cout<<"the first!"<<endl; break;//break语句用在循环语句的循环体内的作用是终止当前的循环语句 case 2: cout<<"the secong!"<<endl; break; default: cout<<"输出错误!!"<<endl; }