istream的::运营商GT;>或istream :: get

时间:2016-05-02 14:53:05

标签: c++ c++11

我正在测试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()

2 个答案:

答案 0 :(得分:4)

operator >>get()之间的主要区别在于前者跳过前导空格,而后者则没有。

答案 1 :(得分:1)

您的变体“有效”,但对输入提出了更严格的要求。

原始代码将成功阅读{ "John Doe" , 29 },但如果您使用get,您还会阅读空格,然后失败。