C++的一个IO有关问题

C++的一个IO问题?
这是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;
    }