cin函数的一点理解

问题

最近学习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只是一个小插曲,但是能从中学到些东西,感觉到欣慰。。。。

原文地址:https://www.cnblogs.com/yxnchinahlj/p/1990649.html