std :: getline () возвращает - PullRequest
       7

std :: getline () возвращает

25 голосов
/ 03 ноября 2008

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

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

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

while (getline(is, line))

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

Ответы [ 4 ]

27 голосов
/ 03 ноября 2008

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

8 голосов
/ 03 ноября 2008

Обновлен:

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

5 голосов
/ 03 ноября 2008

Чарльз дал правильный ответ .

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

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

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

0 голосов
/ 03 ноября 2008

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

...