14.5.4 使用get函数读取单个字符

    第3章中曾介绍过使用get函数和getline函数读取一行字符的操作,这两个函数称为非格式化函数,它们只读取字符输入(包括空格),不进行数据转换。本节讨论如何使用iostream类的get成员函数读取单个字符。

    1.istream&istream:get(char&);

    此函数调用将待赋值char型变量作为其参数,返回的istream类的引用,所以可以将其拼接起来,即下列用法是合法的。


    char c1,c2,c3; cin.get(c1).get(c2).get(c3);甚至是和>>的拼接,如下所示。 cin.get(c1).get(c2)>>c3;

    按从左到右的顺序结合,先将第1个输入字符赋值给c1,并返回cin,则代码变为cin.get(c2)>>c3,而后将第2个输入字符赋值给c2,返回cin,此时代码变为cin>>c3,由于>>默认跳过空白字符,因此,下一个非空字符会被赋值给c3,从这个过程也可以体会到get函数与>>的不同,get函数并不会判断字符是否为空,而只是直接进行读取。

    当istream&get(char&);到达流尾时,不会对参数赋值,还将设置流状态,使得返回的cin测试结果为false,关于流状态的内容稍后会有介绍。

    说明

    所谓流尾,可能是真正的文件尾,也可能是键盘输入的文件尾,如DOS下的CTRL+Z。

    如以下示例代码14.18所示。

    代码14.18 使用有参get函数读取单个字符SingleCharSample1


    <————————————文件名:example1418.cpp———————————————> 01 #include<iostream> 02 using namespace std; 03 int main() 04 { 05 char c1; 06 while(cin. get(c1))//cin的判断测试 07 { 08 cout<<c1; 09 } 10 return 0; 11 }

    输出结果如下所示。


    5(注:键盘输入) 5 A(注:键盘输入) A ^Z(注:键盘输入)

    【代码解析】代码第6行的“cin.get(c1)”将用户输入的字符赋值给c1,并在while结构中显示出来,只要“cin.get(c1)”的返回结果测试为真,这个过程会一直进行下去,只有当到达流尾时,程序才会终止,^Z便是用户通过键盘输入的文件尾。

    代码14.18 中还有一个关键点需要理解,即程序对'\n'的处理,本节一直在强调,get函数不会跳过任何空白,因此,用户输入5和回车后,输入流中有两个字符'5'和'\n',此时,'5'首先被赋值给c1并输出,而后'\n'被赋值给c1并输入,实现换行,输入缓冲区变空,程序可以等待下一步的输入。

    2.int istream:get(void);

    该函数调用读入一个字符(包括空白字符),并返回该字符的整型值,同有参get版本不同,因返回值并非istream类的对象,因此,无法将多个无参get函数拼接起来,基本的用法如下所示。


    char c1=cin.get();下述用法是错误的。 c1=cin.get().get();cin. get()返回一个int值,int内置类型不能调用get函数,因此语法出现错误。但无参get函数可以放在抽取序列的尾部,如下所示。 char c1,c2; c2=cin.get(c1).get();

    上述代码首先执行cin.get(c1),将输入流中的第1个字符赋值给c1,并返回cin,这时代码变为c2=cin.get(),读取下一个字符,并返回其整型值给c2。

    到达流尾后,无参get函数会返回EOF,EOF是iostream类中提供的一个符号常量,多为-1,但可能会随系统的不同而不同,EOF是End Of File的缩写,用以标识文件尾。

    下述代码14.19实现了与代码14.18相同的功能。

    代码14.19 使用无参get函数读取单个字符SingleCharSample2


    <————————————文件名:example1419.cpp———————————————> 01 #include<iostream> 02 using namespace std; 03 int main() 04 { 05 char c1='A'; 06 while((c1=cin. get())!=EOF)//cin的判断测试 07 { 08 cout<<c1; 09 } 10 return 0; 11 }

    输出结果如下所示。


    x(注:键盘输入) x 6(注:键盘输入) 6 ^Z(注:键盘输入)

    【代码解析】代码第6行使用无参get函数读取单个字符,到达流尾时产生的EOF同样会赋值给外部接收变量,读者可从中体会两个get函数的细微差别。