Что возвращает метод istream::getline?
Я спрашиваю, потому что я видел, что для прокрутки файла он должен быть выполнен следующим образом:
while ( file.getline( char*, int ) )
{
// handle input
}
Что возвращается?
Что возвращает метод istream::getline?
Я спрашиваю, потому что я видел, что для прокрутки файла он должен быть выполнен следующим образом:
while ( file.getline( char*, int ) )
{
// handle input
}
Что возвращается?
Он возвращает поток, так что мы можем связать операцию.
Но когда вы используете объект в логическом контексте, компилятор ищет оператор преобразования, который может преобразовать его в тип, который можно использовать в логическом контексте.
В этом случае поток имеет explicit operator bool() const. При вызове он проверяет флаги ошибок. Если установлен failbit или badbit, он возвращает false, иначе возвращает true.
В этом случае поток имеет 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.
}
Посмотрите reference. Исход, возвращаемый из getline, преобразуется в bool посредством неявного преобразования для проверки успеха операции. Это преобразование делает использование if(mystream.getline(a,b)) сокращенным для if(!mystream.getline(a,b).fail()).
Функция возвращает ссылку на сам объект потока, который может использоваться для цепочки дальнейших операций чтения:
myStream.getline(...).getline(...);
или, поскольку потоки неявно конвертируются в void * s, в цикле или условии:
while (myStream.getline(...)) {
...
}
Подробнее об этом можно узнать на веб-сайте cplusplus.com:
Он возвращает сам поток. Поток может преобразовать (через void*) в bool, указав его состояние. В этом примере цикл while прекратится, когда преобразование потока в bool станет "ложным", что происходит, когда ваш поток входит в состояние ошибки. В вашем коде это, скорее всего, произойдет, когда была попытка прочитать конец файла. Короче говоря, он будет читать столько, сколько есть, а затем остановится.
Все сказали вам, что это такое, теперь позвольте мне сказать вам, используйте бесплатную форму версию
std::string line;
while(getline(file, line)) // assuming file is an instance of istream
{
//
}
Почему эта версия? Это должно стать очевидным - вы передаете std::string вместо некоторого фиксированного буфера символов!