您的位置:首页 > 其它

用文件结束符(Ctrl+Z)结束元素输入时不要忘记将流cin恢复为有效状态

2014-12-09 11:33 260 查看
有这样一个题目:

通过标准输入给两个int型vector对象赋值。

一开始,我的程序是这样的:

<pre name="code" class="cpp">#include <iostream>
#include <vector>
using namespace std;
int main()
{
//通过键盘输入两个int型vector对象
vector<int> ivec1,ivec2;
int ival1,ival2;
cout<<"输入多个整数给vector对象ivec1(以Ctrl+Z结束输入):"<<endl;
while(cin>>ival1)
ivec1.push_back(ival1);
cout<<"输入多个整数给vector对象ivec2(以Ctrl+Z结束输入):"<<endl;
while(cin>>ival2)
ivec2.push_back(ival2);
return 0
}



但是,执行结果如下,无法给第二个vector对象输入元素:


经研究发现,原来给第一个vector对象后,由于以文件结束符(Ctrl+Z)结束,将流cin置为了无效状态;所以当第二个while循环再次以流cin作为判断条件时,直接跳出循环。故我们要首先恢复流cin的有效状态,可以通过下面的语句:

cin.clear();

整个程序如下:

<pre name="code" class="cpp">#include <iostream>
#include <vector>
using namespace std;
int main()
{
//通过键盘输入两个int型vector对象
vector<int> ivec1,ivec2;
int ival1,ival2;
cout<<"输入多个整数给vector对象ivec1(以Ctrl+Z结束输入):"<<endl;
while(cin>>ival1)
ivec1.push_back(ival1);
cout<<"输入多个整数给vector对象ivec2(以Ctrl+Z结束输入):"<<endl;
cin.clear();//将流cin恢复为有效状态</span>
while(cin>>ival2)
ivec2.push_back(ival2);
return 0
}



正确结果如下:



其实,我们还可以有另一种解决方案,即不用文件结束符(Ctrl+Z)结束元素输入,而是用某一个条件(如输入一个指定的数字)作为循环判断条件,这样就不用担心流cin的状态了。程序如下:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
//通过键盘输入两个int型vector对象
vector<int> ivec1,ivec2;
int ival1,ival2;
cout<<"输入多个整数给vector对象ivec1(以输入32767结束):"<<endl;
cin>>ival1;
while(ival1!=32767)
{
ivec1.push_back(ival1);
cin>>ival1;
}
cout<<"输入多个整数给vector对象ivec2(以输入32767结束):"<<endl;
cin>>ival2;
while(ival2!=32767)
{
ivec2.push_back(ival2);
cin>>ival2;
}
return 0;
}


故,我们要记住,如果在一个程序中要多次使用同一个流对象(如cin流),在第二次使用前要先将它恢复为有效状态。这个可以参考“流输入输出”的有关部分。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐