1.单字符输入
两个成员函数:int get(void); istream& get(char &ch)
这两个函数读取输入流中下一字符,即使该字符是空格、制表符、换行符等。
区别:遇到文件结束符EOF时int get(void);返回EOF,而 istream& get(char &ch)将返回转换为false;因此,get(ch)可以用来作为是否终止输入的条件,而get()不可以。
istream& get(char &ch)可以拼接使用,而int get(void)不能拼接使用,但可以这样用:cin.get(ch).get() 用来丢弃一个字符(往往用来丢弃换行符'\n')。
>>抽取运算符
chin>>ch;会丢弃流中的空格(空格,换行,制表等),因此不能利用换行符作为输出结束进行判断。
两种单字符输入函数的对比:要处理特殊字符(不可显示的字符,如:空格,换行,制表等)必须使用两个get函数来处理,而 istream& get(char &ch)更高效。
2. 字符串输入
四个成员函数:
istream& get(char *, int, char)
istream& get(char *,int)
istream& getline(char*, int, char)
istream& getline(char *, int)
第一个参数:用于放置字符串的内存单元地址
第二个参数:读取的最大字符数加1
第三个参数:指定字符串间的分界符
以上四个函数的区别:
get 和 getline 函数的区别在于:cin.get(ch..)将分隔符保留在流中,而cin.getline(ch...)会从流中抽取分隔符并丢弃。因此使用cin.get(...)输入字符串时往往这么使用:cin.get(ch...).get() 用来丢弃分隔符,负责分隔符将停留在流中,阻止了下一次cin.get(ch...)对流的抽取。
当输入达到文件结尾时,get与getline都会因无法抽取字符而将空置写入到字符串中。但当输入一行空行时,get函数将设置failbit位,而getline将抽取换行符,但丢弃它,即不存储它。
char temp[80];
while(cin.get(temp,80)){.....} 空行将终止输入
while(cin.getliine(temp,80) && temp[0] != '\0' ){....} 空行亦可终止输入
string类字符串输入:
getline(istream&,string);
该方法以istream作为参数,自动调整string大小,使其能够刚好存储输入的字符,因此不需要指定读取多少字符的数值参数。该方法也可指定分隔字符。
对于string 类型的字符串对象,使用getline(cin,string&)进行输入。
eg1.
#include
using namespace std;
int main()
{
char ch[3][10];
int i=0;
while(i<3){
cin.get(ch[i],10,',').get();
i++;
}
for(i=0;i<3;i++) cout << i << ": " << ch[i] << endl;
return 0;
}
eg2.
#include
using namespace std;
int main()
{
char ch[3][10];
int i=0;
while(i<3){
cin.getline(ch[i],10,',');
i++;
}
for(i=0;i<3;i++) cout << i << ": " << ch[i] << endl;
return 0;
}
eg1 与 eg2 等效。因为cin.get(ch..)将分隔符保留在流中,而cin.getline(ch...)会从流中抽取分隔符并丢弃。
3 字符串异常输入
get(char*,int)和getline()的某些输入形式会影响流状态。在遇到文件尾时会置位eofbit,遇到流被破坏(设备故障)会设置badbit。
在有无字符串输入、输入字符串达到或超过最大字符数时,这两种函数对于流状态的影响不一致。
没有取得任何输入时:getline(..)和get(...)都会设置failbit。
但当读取数目的字符数大于最大数目,且行中还有其它字符,则设置failbit。