istream :: getline тип возвращаемого значения - PullRequest
15 голосов
/ 17 января 2011

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

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

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

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

Ответы [ 5 ]

18 голосов
/ 17 января 2011

Возвращает поток, так что мы можем связать операцию.

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

C ++ 11

В этом случае поток имеет explicit operator bool() const.При вызове он проверяет флаги ошибок.Если бит-бит или битбит установлены, то он возвращает ложь, в противном случае он возвращает истину.

C ++ 03

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

Использование

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

if (stream >> x)
{    
}

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

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

while(std::getline(steam, line))
{
    // The read worked and line is valid.
}
5 голосов
/ 17 января 2011

Взгляд из ссылка . Возвращаемый istream из getline преобразуется в bool путем неявного преобразования для проверки успешности операции Это преобразование превращает использование if(mystream.getline(a,b)) в сокращение для if(!mystream.getline(a,b).fail()).

2 голосов
/ 17 января 2011

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

2 голосов
/ 17 января 2011

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

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

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

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

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

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

0 голосов
/ 17 января 2011

Все рассказали вам, что это, теперь позвольте мне сказать, используйте бесплатную форму версия

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

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

...