Dlaczego fiest osiąga EOF wcześnie?

Piszę bibliotekę C, która wczytuje plik do pamięci. Pomija pierwsze 54 bajty pliku (nagłówek), a następnie odczytuje resztę jako dane. Używam fseek do określenia długości pliku, a następnie używam fread do odczytania pliku.

Pętla działa raz, a następnie kończy się, ponieważ osiągnięto EOF (brak błędów). Na koniec bajtRead = 10624, ftell (strumień) = 28726, a bufor zawiera 28726 wartości. Oczekuję, że fread odczyta 30 000 bajtów, a pozycja pliku 30054, gdy osiągnięty zostanie EOF.

C nie jest moim językiem ojczystym, więc podejrzewam, że gdzieś mam głupi błąd początkującego.

Kod jest następujący:

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;
}

W zależności od użytego odniesienia jest całkiem oczywiste, że dodanie „b” do flagi trybu jest odpowiedzią. Szukam nominacji do odznaki z kości. :-)

To odniesienie mówi o tym w drugim akapicie, drugim zdaniu (choć nie w ich tabeli).

MSDN nie omawia flagi binarnej do połowy strony.

OpenGroup wspomina o istnieniu znacznika „b”, ale stwierdza, że ​​„nie będzie działać”.

questionAnswers(3)

yourAnswerToTheQuestion