每次读取一个字符,直到遇到EOF的输入循环的基本设计如下:
cin.get(ch); //attempt to read a char
while(cin.fail()==false) //test for EOF
{
.........
cin.get(ch); //attempt to read another char
}
可以在上述代码中使用一些简捷方式:
while(!cin.fail()) //while input has not failed
cin.get(char)方法的返回值是一个cin对象。不过,istream类提供了一个可以将istream对象(如cin)转换为bool值的函数;当cin出现在需要bool值得地方(如在while循环的测试条件中)时,该转换函数将被调用。另外,如果最后一次读取成功了,则转换得到的bool值为true,否则为false.这意味着可以将上述while测试改为:
while(cin) //while input is successful
这比!cin.fail()或!cin.eof()更通用,因为它可以检测到其它失败原因,如键盘故障。
此外,由于cin.get(char)的返回值为cin,因此可以将循环精简成这种格式:
while(cin.get(ch)) //while input is successful
{
.......
}
另一种cin.get()版本
不接受任何参数的cin.get()成员函数返回输入中的下一个字符。即可以这样使用:
ch=cin.get()
该函数的工作方式与C语言中的getchar()相似,将字符编码作为int值返回;而cin.get(ch)返回一个对象,而不是读取的字符。同样也可以使用cout.put()函数来显示字符:
cout.put(ch);
该函数的工作方式类似C语言中的putchar(),只不过其参数类型为char,而不是int。
使用cin.get()读取输入:
int ch;
ch=cin.get();
while(ch!=EOF)
{
cout.put(ch);
++count;
ch=cin.get();
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------
cin.get()和cin.get(ch)之间的区别:
属性 cin.get(ch) ch=cin.get()
传递输入字符的方式 赋给参数ch 将返回值赋给ch
用于字符输入时函数返回值 istream类对象(执行bool转换后为true) int类型的字符编码
到达EOF时函数的返回值 istream类对象(执行bool转换后为false) 符号常量EOF
关于如何选择:
使用字符参数的版本更符合对象的方式,因为其返回值是istream对象。这意味着可以将它们拼接起来。如,下面的代码将输入中的下一个字符读入到ch1中,并将接下来的一个字符读入到ch2中:
cin.get(ch1).get(ch2);
函数cin.get(ch1)返回一个cin对象,然后便可以通过该对象调用get(ch2)。
get()的主要用途是能够将stdio.h的getchar() putchar()函数转换为iostream的cin.get()和cout.put()方法。
附:
许多程序都逐字节的读取文本输入或文本文件,isteam类提供了多种可完成这种工作的方法,如果ch是一个char变量,则下面的语句:cin>>ch;
将输入的下一个字符读入到ch中。不过,它将忽略空格、换行符和制表符。下面的成员函数调用:
cin.get(ch);
读取输入中的下一个字符,而不管该字符是什么,并将其存储到ch中。
成员函数调用cin.get()返回下一个输入字符,包括空格、换行符、制表符,因此,可以这样使用它:
ch=cin.get();
cin.get(char)成员函数调用通过返回转换为false的bool值来指出已到达EOF,而cin.get()成员函数调用则通过返回EOF值来指出已到达EOF,EOF是在文件iostream中定义的。