Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

C++11

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

C++03

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

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

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

if (stream >> x)
{    
}

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

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

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

Другие советы

Смотри от ссылка. Анкет Istream вернулся из getline преобразуется в Bool неявное преобразование Чтобы проверить успех работы. Это преобразование делает использование if(mystream.getline(a,b)) в стенографию для if(!mystream.getline(a,b).fail()).

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

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

или, потому что потоки неявно кабриочны для void *S, в цикле или состоянии:

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top