-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.
}
Что мы и хотим.