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