Почему фред достигает EOF рано?
Я пишу библиотеку C, которая читает файл в память. Он пропускает первые 54 байта файла (заголовка), а затем считывает остаток как данные. Я использую fseek для определения длины файла, а затем использую fread для чтения в файле.
Цикл запускается один раз, а затем завершается, потому что EOF достигнут (без ошибок). В конце bytesRead = 10624, ftell (stream) = 28726, и буфер содержит 28726 значений. Я ожидаю, что fread будет читать 30000 байт, а позиция файла будет 30054, когда будет достигнут EOF.
C не мой родной язык, поэтому я подозреваю, чтогде-то есть глупая ошибка новичка
Код выглядит следующим образом:
const size_t headerLen = 54;
FILE * stream;
errno_t ferrno = fopen_s( &stream, filename.c_str(), "r" );
if(ferrno!=0) {
return -1;
}
fseek( stream, 0L, SEEK_END );
size_t bytesTotal = (size_t)(ftell( stream )) - headerLen; //number of data bytes to read
size_t bytesRead = 0;
BYTE* localBuffer = new BYTE[bytesTotal];
fseek(stream,headerLen,SEEK_SET);
while(!feof(stream) && !ferror(stream)) {
size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-bytesRead,stream);
bytesRead+=result;
}
В зависимости от используемой вами ссылкиСовершенно очевидно, что добавление "б" на флаг режима есть ответ. Поиск кандидатур на нагрудный знак. :-)
Эта ссылка Об этом говорится во втором абзаце, втором предложении (хотя и не в их таблице).
MSDN Безразлично»не обсуждайте двоичный флаг до тех пор, пока на полпути вниз страницы
OpenGroup упоминает о существовании "б" тег, но утверждает, что этоне будет иметь никакого эффекта ".