zoukankan      html  css  js  c++  java
  • 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只是一个小插曲,但是能从中学到些东西,感觉到欣慰。。。。

  • 相关阅读:
    Minimum Sum
    Prefix and Suffix
    BBuBBBlesort!
    Wanna go back home
    The Chosen One+高精度
    一元三次方程
    文本文件比对
    nginx日志文件切割
    nginx启动脚本
    nginx
  • 原文地址:https://www.cnblogs.com/yxnchinahlj/p/1990649.html
Copyright © 2011-2022 走看看