2016-05-02 3 views
0

Я тестировал блок кода из книги C++ PL и нашел следующий фрагмент кода (я не хотел чувствовать, что я копировал его из книга моего IDE, так что я, по крайней мере, изменил имена переменных):istream :: operator >> or istream :: get

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 :: получить «Выделяет один символ из потока»

И по this link IStream :: оператор >> «Извлекает как можно больше символов из потока»

Из любопытства я заменил

if (is>>ch1 && is>>ch2 && ch1=='{' && ch2=='"') 

с

if (is.get(ch1) && is.get(ch2) && ch1=='{' && ch2=='"') 

И это сработало. Отсутствие ошибок компиляции и программа, видимо, не сделал то, что он должен был сделать, теперь мой вопрос:

Почему оператор >> используется в контексте, где мы извлечь один символ, когда is.get() будет в равной степени функциональной?

+3

Ну, это не более трех символов. – NathanOliver

+0

Это было бы еще один тест 'if (is >> ch1 >> ch2 && ch1 == '{' && ch2 == '"') ' –

+0

@LokiAstari Вы правы. Я проверю книгу, возможно, автор использует это так и я не заметил (в конце концов, это в строке if (is >> ContactAge >> ch1 && ch1 == '}')) – Compa

ответ

4

Главное отличие между operator >> и get() заключается в том, что первое пропускает ведущие пробелы, а второе - нет.

1

Ваш вариант «работал», но налагает более строгие требования на вход.

Исходный код будет успешно прочитан { "John Doe" , 29 }, но если вы используете get, вы также прочитаете пробелы и потерпите неудачу.

+0

Я заметил, что у меня есть if (is >> ch1 && ch1 == ',') , и когда я попробовал «Hector Corea», он был преобразован в «HectorCorea». После того, как я сменил его на is.get (ch1) , он работал как шарм. – Compa

Смежные вопросы