我正在测试C ++ PL书中的一段代码并找到了下一段代码(我不想让我觉得我从书本到我的IDE进行了复制,所以我至少改变了变量名称):
istream& operator>> (istream& is, MyContact& mc)
{
char ch1, ch2;
string ContactName{""};
if (is>>ch1 && is>>ch2 && ch1=='{' && ch2=='"')
{
while(is>>ch1 && ch1 != '"')
ContactName+=ch1;
if (is>>ch1 && ch1==',')
{
int ContactAge=0;
if (is>>ContactAge>>ch1 && ch1=='}')
{
mc={ContactName, ContactAge};
return is;
}
}
}
is.setstate(ios_base::failbit);
return is;
}
根据this link istream :: get“从流中提取单个字符”
根据this link istream :: operator>> “从流中提取尽可能多的字符”
出于好奇,我换了
if (is>>ch1 && is>>ch2 && ch1=='{' && ch2=='"')
带
if (is.get(ch1) && is.get(ch2) && ch1=='{' && ch2=='"')
它有效。没有编译错误,程序显然做了它应该做的事情,现在我的问题是:
当>>
具有同等功能时,为什么在我们提取单个字符的上下文中使用运算符is.get()
?
答案 0 :(得分:4)
operator >>
和get()
之间的主要区别在于前者跳过前导空格,而后者则没有。
答案 1 :(得分:1)
您的变体“有效”,但对输入提出了更严格的要求。
原始代码将成功阅读{ "John Doe" , 29 }
,但如果您使用get
,您还会阅读空格,然后失败。