Что возвращает метод istream::getline
?istream :: getline return type
Я спрашиваю, потому что я видел, что петли через файл, это должно быть сделано так:
while (file.getline(char*, int))
{
// handle input
}
Что возвращается?
Что возвращает метод istream::getline
?istream :: getline return type
Я спрашиваю, потому что я видел, что петли через файл, это должно быть сделано так:
while (file.getline(char*, int))
{
// handle input
}
Что возвращается?
Он возвращает поток, чтобы мы могли связать операцию.
Но когда вы используете объект в булевом контексте, компилятор ищет оператор преобразования, который может преобразовать его в тип, который может использоваться в булевом контексте.
В этом случае поток имеет operator void*()
. Поскольку это приводит к указателю, его можно использовать в булевом контексте. При вызове он проверяет флаги ошибок. Если установлены либо битбиты, либо бадбит, он возвращает NULL, который эквивалентен FALSE, иначе он возвращает указатель на self (или что-то еще, хотя вы не должны использовать этот факт)).
Таким образом, вы можете использовать поток в любом контексте, что потребует булево тест:
if (stream >> x)
{
}
while(stream)
{
/* do Stuff */
}
Примечание: Это плохая идея, чтобы проверить поток на внешней стороне, а затем чтение/запись к нему внутри тела условного/циклического оператора. Это связано с тем, что акт чтения может сделать поток плохим. Обычно лучше читать как часть теста.
while(std::getline(steam, line))
{
// The read worked and line is valid.
}
Посмотрите с reference. Исход, возвращаемый с getline
, преобразуется в bool на implicit conversion, чтобы проверить успешность операции. Это преобразование делает использование if(mystream.getline(a,b))
сокращенным для if(!mystream.getline(a,b).fail())
.
Функция возвращает ссылку на самом потоке объект, который может быть использован либо цепь дополнительно операций чтения:
myStream.getline(...).getline(...);
или, поскольку потоки неявно конвертируются в void *
с, в цикле или состояниях:
while (myStream.getline(...)) {
...
}
Вы можете прочитать об этом на сайте cplusplus.com:
Он возвращает поток непосредственно. Поток может преобразовывать (через void*
) в bool
с указанием его состояния. В этом примере цикл while
прекратится, когда преобразование потока в bool
будет «ложным», что происходит, когда ваш поток войдет в состояние ошибки. В вашем коде это, скорее всего, произойдет, когда была попытка прочитать за конец файла. Короче говоря, он будет читать столько, сколько есть, а затем остановиться.
+1. Он может преобразовать в bool, потому что он перегружает 'operator bool()' (или 'operator void *()', не уверен, что) – Cameron
@Cameron: Это 'operator void *()'. –
Каждый сказал вам, что это такое, теперь позвольте мне сказать вам, используйте free form версию
std::string line;
while(getline(file, line)) // assuming file is an instance of istream
{
//
}
Почему эта версия? Это должно стать очевидным - вы передаете в std::string
, а не в буфер фиксированного размера!
, но что, если вы хотите 'char *' вместо 'std :: string'? это та ситуация, в которой я нахожусь. –
'std :: string' имеет метод' c_str() ', который вернет вам то, что вам нужно, если вам нужно изменить строку, тогда есть методы' std :: string' вы можете использовать его для изменения. – Nim
istream & is the return type. – DumbCoder
Да, я должен был сказать, что я уже это знаю. но, очевидно, что-то странно об этом, потому что от него происходит какая-то форма истинного или ложного. –
Он перегружает операторы 'bool' или' void * ', так что, когда он получает неявное выражение в условии if(), он может вернуть, достигнут ли EOF или нет. – Cameron