istream::возвращаемый тип getline
Вопрос
Что делает 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:
Он возвращает сам поток. Поток может конвертировать (через void*
) к bool
указывает на его состояние. В этом примере ваш while
петля прекратится, когда переход потока в bool
идет «false», что происходит, когда ваш поток входит в состояние ошибки. В вашем коде это, скорее всего, произойдет, когда произошла попытка прочитать через конец файла. Короче говоря, он будет читать столько же, сколько есть, а затем остановиться.
Все сказали вам, что это такое, теперь позвольте мне сказать вам, используйте свободная форма версия
std::string line;
while(getline(file, line)) // assuming file is an instance of istream
{
//
}
Почему эта версия? Это должно сразу же стать очевидным - вы проходите в std::string
Вместо того, чтобы какой -то буфер персонажей фиксированного размера!