istream:: тип возврата getline

Что значит istream::getline способ вернуться?

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

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

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

5 ответов


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

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

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

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

if (stream >> x)
{    
}

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

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

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

посмотреть с ссылка. Истрим вернулся из 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 вместо некоторого буфера символов фиксированного размера!