Warum erreicht Fread die EOF frühzeitig?

Ich schreibe eine C-Bibliothek, die eine Datei in den Speicher liest. Es überspringt die ersten 54 Bytes der Datei (Header) und liest dann den Rest als Daten. Ich benutze fseek, um die Länge der Datei zu bestimmen, und benutze dann fread, um die Datei einzulesen.

Die Schleife läuft einmal und endet dann, weil die EOF erreicht ist (keine Fehler). Am Ende ist bytesRead = 10624, ftell (stream) = 28726 und der Puffer enthält 28726 Werte. Ich erwarte, dass fread 30.000 Bytes liest und die Dateiposition 30054 ist, wenn EOF erreicht ist.

C ist nicht meine Muttersprache und ich vermute, dass ich irgendwo einen dummen Anfängerfehler habe.

Der Code lautet wie folgt:

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

Abhängig von der von Ihnen verwendeten Referenz ist es offensichtlich, dass das Hinzufügen eines "b" zum Modus-Flag die Antwort ist. Ich suche Nominierungen für das Bonehead-Badge. :-)

Diese Referenz spricht darüber im zweiten Absatz, zweiter Satz (wenn auch nicht in ihrer Tabelle).

MSDN bespricht das binäre Flag erst in der Mitte der Seite.

OpenGroup erwähnt das Vorhandensein des "b" -Tags, gibt jedoch an, dass es "keine Auswirkung haben soll".

Antworten auf die Frage(3)

Ihre Antwort auf die Frage