-1 — это способ get
сказать, что вы достигли конца файла. Сравните это с помощью std::char_traits<char>::eof()
(или std::istream::traits_type::eof()
) - избегайте -1, это магическое число. (Хотя другой немного многословен - вы всегда можете просто позвонить istream::eof
)
Флаг EOF устанавливается только в том случае, если операция чтения пытается читать за концом файла. Если у меня есть 3-байтовый файл, и я читаю только 3 байта, EOF равен false
, потому что я еще не пытался читать дальше конца файла. Хотя это кажется запутанным для файлов, которые обычно знают свой размер, EOF неизвестен до тех пор, пока не будет предпринята попытка чтения на некоторых устройствах, таких как каналы и сетевые сокеты.
Второй пример работает, так как inf >> foo
всегда будет возвращать inf
с побочным эффектом попытки прочитать что-то и сохранить это в foo
. inf
в if
или while
оценивается как true
, если файл "хороший": нет ошибок, нет EOF. Таким образом, когда чтение завершается ошибкой, inf
оценивается как false
, и ваш цикл корректно прерывается. Однако возьмите эту распространенную ошибку:
while(!inf.eof()) // EOF is false here
{
inf >> x; // read fails, EOF becomes true, x is not set
// use x // we use x, despite our read failing.
}
Однако это:
while(inf >> x) // Attempt read into x, return false if it fails
{
// will only be entered if read succeeded.
}
Чего мы и хотим.
person
Thanatos
schedule
26.12.2010