问题
最近学习C++碰到这样一个问题,while(cin>>s){},这样的一个语句用什么样的输入能够结束运行,到网上一查,大家给出的答案是ctrl+z,可以使该程序结束。但是,对于ctrl+z的作用和ctrl+z的实质是什么却都没有深刻的剖析。于是,翻书找到了些内容,认为自己解决了这个问题。现将学习到的内容记录如下。首先,先了解一下,究竟能是一个输入流停止工作的有哪些条件。
流的状态
流有正常的状态和错误的状态。流只有在正常的状态下,才能够正常的工作。输入流在正常的工作状态下,才能够执行读的操作。ctrl+z,的作用其实就是让流从正常的工作状态,转为不工作的其实也可以说是错误的工作状态,所以才能让while(cin>>s){}这样的语句结束。
每个流对象都维护了一组条件标志,通过这些条件标志,可以监视流当前的状态。可以调用下面四个谓词成员函数:
1.如果一个流遇到文件结束符,eof返回true。
if(inOut.eof())
//ok,都读进来了
2.如果试图做一个无效的操作,比如seeking重定位操作超出了文件尾。则bad()返回true。一般地,这表示该流由于某种未定义的方式而被破坏了。
3.如果操作不成功,如打开了一个文件流对象失败或者遇到了一种无效的输入格式,则fail()返回true
ifstream iFile(filename,ios_base::in);
if(iFile.fail())//不能打开
error_message(........);
4.如果其他条件都不为true,则good()返回true。
if(inOut.good())
显示地修改流对象的条件状态有两种方式。第一,使用clear()成员函数,可以把条件状态复位到一个显式的值。第二,使用setstate()成员函数。
测试
int main(){
cout<<cin<<endl;
string s;
while(cin>>s)
{
cout<<s;
}
cout<<cin<<endl;
}
输入 a enter b enter ctrl+z enter ctrl+z enter
运行结果:
00480F20
a b
00000000
ctrl+z究竟是什么
ctrl+z的作用是结束流,相当于eof。
总结
if(!cin)
流不能正常工作
else
流能正常工作
写程序的时候,可能要注意这点。ctrl+z只是一个小插曲,但是能从中学到些东西,感觉到欣慰。。。。