2008-11-03 2 views
25

У меня есть цикл, который читает каждую строку в файле с помощью getline().std :: getline() возвращает

istream is; 
string line; 
while (!getline(is, line).eof()) 
{ 
} 

Я заметил, что вызов GetLine(), как это также, кажется, работает:

while (getline(is, line)) 

Что здесь происходит? getline() возвращает ссылку на поток. Это как-то преобразуется в указатель? Действительно ли это хорошая практика или я должен придерживаться первой формы?

ответ

26

istream, возвращаемый getline(), имеет неявный вызов оператора void *(), который возвращает ли поток в ошибку. Таким образом, это делает больше проверок, чем вызов eof().

+0

Чарльз прав, вы также путаетесь с оператором, предоставленным часовым. – 2008-11-03 17:42:34

8

Обновлено:

я ошибочно указал на basic_istream documentation для метода оператора BOOL() на классе basic_istream :: сторожевого, но, как уже отмечалось, это на самом деле не то, что происходит. Я голосовал за правильные ответы Чарльза и Люка. На самом деле оператор void *() вызывает вызов. Подробнее об этом in the C++ FAQ.

+0

Вы путаете часовой с basic_ios :: Оператором недействительным *() -> http://dinkumware.com/ manuals/default.aspx? manual = compleat & page = ios.html # basic_ios :: operator% 20void% 20 * – 2008-11-03 17:41:48

+0

Хорошая точка. Я тоже исправляю. – tgamblin 2008-11-03 22:32:54

+1

Ваша ссылка мертва – qdii 2013-07-03 10:20:57

-3

Я бы придерживался первой формы. В то время как вторая форма может работать, она вряд ли очевидна. В вашем исходном коде четко описывается, что делается и как оно должно вести себя.

5

Чарльз дал correct answer.

Что называется действительно std::basic_ios::operator void*(), а не sentry::operator bool(), что последовательно с тем, что std::getline() возвращающим std::basic_istream (таким образом, в std::basic_ios), а не сторожевой.

Для не верующих, см:

В противном случае, как уже говорилось, предпочитают вторую форму h является каноническим. не Использование не fail(), если на самом деле вы хотите подробный код - я никогда не помню, может ли xxx.good() использоваться вместо !xxx.fail()

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