美文网首页简友广场想法C++学习笔记
第五章 循环和关系表达式(4)循环和文本输入

第五章 循环和关系表达式(4)循环和文本输入

作者: 阿厉a_li | 来源:发表于2019-12-10 09:23 被阅读0次

    (四)循环和文本输入

    1.文本输入:cin, cin.get()的函数重构

        通常可以使用循环体来进行文本的输入,输入有输入队列,一般在我们按回车后输入才会到达程序进行处理。比如cin >>a;a为一个char类型,则你可以输入一个句子,等回车后整个字符串才进入内存,将第一个非空白字符赋值给a。

        cin >> a; cin函数直接应用,会读入一个字符,字符忽略空格table等空白字符,也就是遇到这些字符直接略过。如果想要输入空白,则可以使用cin对象的类函数cin.get(a);这种重构类型,它会读入空白的字符,包括空格,table和回车键。cin.get还有一种用法为cin.get(name,size);前面一个参数是字符数组的名称或指针,后一个参数是最大存储量,这个用法可以读入一行(遇到回车或最大存储量的时候就停止读入,回车留在输入队列中)。

    2.文件结尾

    (1)文件结尾标志EOF

        这个标志可以在键盘模拟,比如windows是任意位置(也可能行首)的ctrl+z加回车,而unix及linux为行首输入Ctrl+D,因此可以使用这个文件结尾标志(用键盘来模拟文件结尾标志)来使循环停止。unix不使用ctrl+z的形式是因为它将这个组合表示为程序挂起,而用fg来恢复运行挂起的程序。

        当cin输入读到文件结尾标志的时候,会设置标志位eofbit和failbit,因此,可以通过这两个标志位判断函数(是cin.eof()==truecin.fail()==true)来确认是否到达了文件结尾。还有一种检查的办法是直接将cin返回的对象强制类型转换成bool型,因为cin返回的仍然是cin对象,当对其进行强制类型转换的时候,如果上一次输入成功,则返回true,否则是false,因此上面的判断可以是这样的while(cin){}或者while(bool(cin)){}。使用cin强制转换是比cin.fail()和cin.eof()更通用的,因为读取失败可能有很多原因,而cin对各种原因都是适用的。

        注意:cin.get()的重载类型返回的是一个char类型(或者说是int型编码),而函数cin.get(ch)返回的是cin对象,这二者之间的区别要注意一下。

    (2)利用cin.get()来检测文件结尾的方法(检测文件结尾的另一种方法)

        采用cin的函数cin.get(),比如a=cin.get();将会将读取的字符赋值给a,当读到EOF时,将EOF赋值给a(此时a应是一个int型),一般EOF的值为整型-1,而要输出时,此时a应该要进行强制类型转换char(a)才能输出为字符。

         这里还要注意的是,cin.get(a);这个语句是不会将EOF赋值给a的,这个语句返回的是一个cin对象,因此cin.get(a).get(b);这样的语句是可以被允许的。

    (3)cin.clear()可以重置输入流的状态。

        当我们希望被模拟的EOF阻断继续的时候,我们需要用cin.clear()来重置输入流,此时缓冲区的内容依然存在,而failbit位和eofbit位,badbit位将会重新设置成0。然后如果需要的话我们再次使用cin.ignore()来忽略第一个字符(或者用cin.get()来吃掉一个字符)。

    相关文章

      网友评论

        本文标题:第五章 循环和关系表达式(4)循环和文本输入

        本文链接:https://www.haomeiwen.com/subject/kpekgctx.html