c++的标准输入流测试循环问题
在老外的C++教程里面一般都会介绍一个标准输入流的条件测试cin>>num;把它作为循环条件的时候可以用来测试文件尾,但我目前发现的问题是这个条件的失败情况并不是遇到了回车换行符,而是读取数据失败的情况,也就是说如果把测试函数写成这样的话:int mai()
{
int num=0,
sum=0;
while(cin>>num)
sum+=num;
cout<<"total is:"<<sum<<endl;
return 0;
}
如果仅仅一次输入1 2 3 4的话就会出现无限循环的情况,回车之后根本不是传说中的文件尾测试,而是数据读取测试,必须在后面加上一个非int类型的数据才算读取失败,也就是说必须输入1 2 3 4y这样的数据才能结束循环输出总和,然而新的问题成为了:我如何控制那些非int类型数据的缓冲读入。我尝试改变测试代码如下:
int main()
{
int num=0,
sum=0;
char c; //用于记录最开始的非int字符
char arr[10]="bad";
while(cin>>num)
sum+=num;
cin>>c; //
cin>>arr; //添加的测试
cout<<"total is:"<<sum<<endl;
cout<<c<<endl;
cout<<arr<<endl;
return 0;
}
我使用了VC++6.0和gcc(sgywin)测试了代码,结果是添加的4行代码直接被那个循环屏蔽了,添加的那两行代码根本无效,用调试器也是,直接不用输入就一路给步过了。我输入了1 2 3 4ygood,然后输出是:
total is:10
//空行是因为字符变量c定义的同时被gcc初始化了
bad
把那个循环封装到函数里面但从那个位置插入调用也是一样的效果,请问各位大虾为何?