Я думаю, что Конрад Рудольф, о котором вы говорите в комментарии к другому ответу, хорошо говорит о проблеме с чтением до конца. Если вы не достигли eof из-за какой-то другой ошибки, вы попали в бесконечный цикл. Поэтому примите его совет, но измените его, чтобы решить проблему, которую вы определили. Один из способов сделать это заключается в следующем:
bool okay=true;
while ( okay ) {
okay = inputFile.read(inputBuffer, blockSize);
int i = inputFile.gcount();
if( i ) {
//Do stuff
}
}
Редактировать: Поскольку мой ответ принят, я редактирую его, чтобы он был максимально полезным. Оказывается, мой bool хорошо совершенно не нужен (см. Ответ ferosekhanj). Лучше проверить значение inputFile напрямую, что также имеет то преимущество, что вы можете элегантно избегать входа в цикл, если файл не открывается нормально. Поэтому я думаю, что это каноническое решение этой проблемы;
inputFile.open( "test.txt", ios::binary );
while ( inputFile ) {
inputFile.read( inputBuffer, blockSize );
int i = inputFile.gcount();
if( i ) {
//Do stuff
}
}
Теперь, когда вы в последний раз // делаете вещи, я буду меньше, чем blockSize, за исключением случая, когда файл будет кратным байту blockSize.
Ответ Конрада Рудольфа здесь также хорош, у него есть то преимущество, что .gcount () вызывается только один раз, вне цикла, но недостатком является то, что он действительно нуждается в обработке данных, чтобы поместить в отдельный функция, чтобы избежать дублирования.