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