Сбойный бит предназначен для того, чтобы поток мог сообщить, что какая-то операция не завершилась успешно.Это включает ошибки, такие как невозможность открыть файл, попытка прочитать данные, которые не существуют, и попытка прочитать данные неправильного типа.
Конкретный случай, о котором вы спрашиваете, перепечатывается здесь:
char buffer[10];
stream.read(buffer, sizeof(buffer));
Ваш вопрос заключается в том, почему сбой устанавливается, когда достигается конец файла до того, как все входные данные прочитаны.Причина в том, что это означает, что операция чтения завершилась неудачно - вы попросили прочитать 10 символов, но в файле недостаточно символов.Следовательно, операция не завершилась успешно, и поток сообщает об ошибке, чтобы сообщить вам об этом, даже если доступные символы будут прочитаны.
Если вы хотите выполнить операцию чтения, в которой вы хотите прочитать до некоторого количества символов, вы можете использовать функцию-член readsome
:
char buffer[10];
streamsize numRead = stream.readsome(buffer, sizeof(buffer));
Эта функция будет читать символы до конца файла, но в отличие от read
она неНе устанавливайте failbit, если конец файла достигнут до того, как символы будут прочитаны.Другими словами, он говорит: «Попробуй прочитать столько символов, но это не ошибка, если не можешь. Просто дай мне знать, сколько ты читаешь».Это контрастирует с read
, который говорит: «Я хочу точно столько символов, и это ошибка, если вы не можете это сделать».
РЕДАКТИРОВАТЬ :Важная деталь, которую я забыл упомянуть, это то, что eofbit может быть установлен без запуска failbit.Например, предположим, что у меня есть текстовый файл, который содержит текст
137
без каких-либо символов новой строки или конечных пробелов после этого.Если я напишу этот код:
ifstream input("myfile.txt");
int value;
input >> value;
Тогда в этот момент input.eof()
вернет true, потому что при чтении символов из файла поток попадает в конец файла, пытаясь увидеть, были ли какие-либо другиесимволы в потоке.Однако input.fail()
будет , а не вернет true, потому что операция прошла успешно - мы действительно можем прочитать целое число из файла.
Надеюсь, это поможет!