习惯了使用while(~scanf("%d",x)){}
来实现循环读入,但是有时候使用泛型编程的时候就必须使用C++中的cin
,但是当我想要实现循环读入的时候却发现有些困难。
我们可以看一下下面这个简单的例子:
#include <iostream>using namespace std;int main()
{int n;while(cin>>n){cout<<n<<endl;}int x;cout<<"请输入x:"; cin>>x;cout<<"x的值为"<<x<<endl;return 0;
}
运行结果:
这和我们想要的不一样。为了能够使用cin
进行循环读入,就必须使用cin
的一些成员函数
实际上我们使用cin
读取失败以后会有一个错误的标志位,cin.fail()
将会为真。如果我们不清除的话是没有办法再使用cin
的。因此使用失败后应该cin.clear()
方法清除标志位
但是此时还是不能正常读取,这是因为缓冲区中仍然是那个错误的输入,为了解决这个问题,我们可以使用cin.ignore()
清除缓冲区,这样就可以重新输入啦。
这两个方法还可以带参数,但是简单使用的话不用考虑那么多。
然后我们就能够使用cin
循环读入啦。
#include <iostream>using namespace std;int main()
{int n;cin>>n;while(cin.fail() == false)//没有发生错误{cout<<n<<endl;cin>>n;}cin.clear(); cin.ignore();int x;cout<<"请输入x:"; cin>>x;cout<<"x的值为"<<x<<endl;return 0;
}
运行结果