1,方法get(char &)和get(void)提供不跳过空白的单字符输入功能;
2,函数get(char * , int , char)和getline(char * , int , char)在默认情况下读取整行而不是一个单词;
它们被称为非格式转化输入函数,因为它们只是读取字符输入,而不会跳过空白,也不进行数据转换。
在使用char参数或没有参数的情况下,get()方法读取下一个字符,及时该字符是空格,制表符或换行符。get(char & ch)版本将输入字符赋给其参数,而get(void)版本将输入字符转换为整型(通常为int)。然后将其返回。
假设提供了输入:I C++ clearly.
按下回车后这行输入将被发送给程序。先读取字符 ‘I’ ,使用cout显示它,接着读取空格,显示它。这个过程将一直持续下去,知道程序将回车当做换行符处理,并终止循环。重点是,使用get(ch),代码读取,显示并考虑空格和可打印字符。
因此程序输出为:I C++ clearly.
假设程序使用 >> :
代码会跳过空格,则程序输出为:IC++clearly.
更糟糕的是程序不会终止。由于抽取运算符跳过了换行符,因此代码不会将换行符赋给ch,所以while循环将不会终止。
另外get(char &)成员函数返回一个指向用于调用它的istream对象的引用,这意味着可以拼接get(char &)后面的其他抽取:
首先,cin.get(c1)将第一个输入字符赋给c1,并调用返回对象——cin,这样将代码缩为cin.get(c2) >> c3,以此类推。
如果cin.get(char &)到达文件尾——无论是真正的文件尾,还是通过键盘仿真的文件尾,它都不会给其参数赋值。另外,该方法还调用setstate(failbit)导致cin的测试结果为false:
只要存在有效输入,cin.get(ch)的返回值都将是cin,此时的判定结果为true,因此循环将继续,到达文件尾时,返回判定值为false,循环终止。
get(void)成员函数还读取空白,但使用返回值来输入传递给程序。
get(void)成员函数的返回值为int(或某种更大的整型,这取决于字符集和区域)。
则下面的程序非法:
由于返回不是类对象,因此不能对它应用成员运算符。
到达文件尾后(不管是真正的文件尾还是模拟的文件尾),cin.get(void)都将返回EOF,以此来结束循环。
cin.get(ch) 与 cin.get()
特征 cin.get(ch) ch = cin.get()
传输输入字符的方法 赋给参数ch 将函数返回值赋给ch
字符输入时函数的返回值 指向istream对象的引用 字符编码(int值)
到达文件尾时函数的返回值 转换为false EOF
第一个参数是用于放字符串的内存单元的地址。
第二个参数比要读取的最大字符数大1,(额外的一个字符用于存储结尾的空字符)。
第三个参数指定用作分界符的字符。
只有两个参数的版本将使用换行符用作分界符。
cin.getline() 和 cin.get()的区别在于getline()函数将丢弃输入中的‘#’, 而get()函数不会。
getline() 和 get() 在遇到文件结尾时将设置eofbit,遇到流破坏时将设置badbit。
另外两种特殊情况是无输入以及输入达到或超过函数调用指定的最大字符数。
空行会导致get()函数设置failbit(),则:
有意思的是getline却不会这么做,这是因为getline()仍然抽取换行符,虽然不会存储它。如果使用getline()遇到输入空行,可以这样写:
现在假设输入队列中的字符数等于或超过了输入方法指定的最大字符数,来先看看getline()函数:
如果遇到文件尾,则设置eofbit
如果将要读取的是换行符,则该字符将被读取并丢弃
如果读取了79个字符,并且下一个字符不是换行符,则设置filebit。
get()方法,如果它读取了最大数目的字符,则不设置failbit。然而,由此可以知道终止读取是否是由输入字符过多引起的,。可以使用peek()来查看下一个输入的字符。如果是换行符则已经读取整行,如果不是换行符,则说明get()是在到达行尾前停止的。这种技术对getline()不适用, 因为getline()读取并丢弃换行符,因此无法查看下一个字符。
getline(char *, int) 如果没有读取任何字符(但换行符被视为读取了一个字符),则设置failbit
如果读取了最大数目的字符,且行中还有其他字符,则设置failbit
get(char *, int) 如果没有读取任何字符,则设置failbit