2011-01-16 3 views
13

Что возвращает метод istream::getline?istream :: getline return type

Я спрашиваю, потому что я видел, что петли через файл, это должно быть сделано так:

while (file.getline(char*, int)) 
{ 
    // handle input 
} 

Что возвращается?

+0

istream & is the return type. – DumbCoder

+0

Да, я должен был сказать, что я уже это знаю. но, очевидно, что-то странно об этом, потому что от него происходит какая-то форма истинного или ложного. –

+0

Он перегружает операторы 'bool' или' void * ', так что, когда он получает неявное выражение в условии if(), он может вернуть, достигнут ли EOF или нет. – Cameron

ответ

15

Он возвращает поток, чтобы мы могли связать операцию.

Но когда вы используете объект в булевом контексте, компилятор ищет оператор преобразования, который может преобразовать его в тип, который может использоваться в булевом контексте.

В этом случае поток имеет operator void*(). Поскольку это приводит к указателю, его можно использовать в булевом контексте. При вызове он проверяет флаги ошибок. Если установлены либо битбиты, либо бадбит, он возвращает NULL, который эквивалентен FALSE, иначе он возвращает указатель на self (или что-то еще, хотя вы не должны использовать этот факт)).

Таким образом, вы можете использовать поток в любом контексте, что потребует булево тест:

if (stream >> x) 
{  
} 

while(stream) 
{ 
    /* do Stuff */ 
} 

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

while(std::getline(steam, line)) 
{ 
    // The read worked and line is valid. 
} 
5

Посмотрите с reference. Исход, возвращаемый с getline, преобразуется в bool на implicit conversion, чтобы проверить успешность операции. Это преобразование делает использование if(mystream.getline(a,b)) сокращенным для if(!mystream.getline(a,b).fail()).

+0

Ваша ссылка не содержит ничего, что соответствует вашему утверждению. – iheanyi

+0

@iheanyi Добавлено разъяснение, возможно, страницы со временем изменились. –

+0

Спасибо, я поддержал ваш ответ с этим изменением. – iheanyi

2

Функция возвращает ссылку на самом потоке объект, который может быть использован либо цепь дополнительно операций чтения:

myStream.getline(...).getline(...); 

или, поскольку потоки неявно конвертируются в void * с, в цикле или состояниях:

while (myStream.getline(...)) { 
    ... 
} 

Вы можете прочитать об этом на сайте cplusplus.com:

http://cplusplus.com/reference/iostream/istream/getline/

2

Он возвращает поток непосредственно. Поток может преобразовывать (через void*) в bool с указанием его состояния. В этом примере цикл while прекратится, когда преобразование потока в bool будет «ложным», что происходит, когда ваш поток войдет в состояние ошибки. В вашем коде это, скорее всего, произойдет, когда была попытка прочитать за конец файла. Короче говоря, он будет читать столько, сколько есть, а затем остановиться.

+0

+1. Он может преобразовать в bool, потому что он перегружает 'operator bool()' (или 'operator void *()', не уверен, что) – Cameron

+0

@Cameron: Это 'operator void *()'. –

0

Каждый сказал вам, что это такое, теперь позвольте мне сказать вам, используйте free form версию

std::string line; 
while(getline(file, line)) // assuming file is an instance of istream 
{ 
// 
} 

Почему эта версия? Это должно стать очевидным - вы передаете в std::string, а не в буфер фиксированного размера!

+0

, но что, если вы хотите 'char *' вместо 'std :: string'? это та ситуация, в которой я нахожусь. –

+0

'std :: string' имеет метод' c_str() ', который вернет вам то, что вам нужно, если вам нужно изменить строку, тогда есть методы' std :: string' вы можете использовать его для изменения. – Nim