Frage

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

Die Schleife einmal ausgeführt wird und dann endet, weil das EOF (keine Fehler) erreicht ist. Am Ende bytesread = 10624, ftell (stream) = 28726, und der Puffer enthält 28726 Werte. Ich erwarte, dass fread 30.000 Bytes und die Dateiposition lesen 30054 sein, wenn EOF erreicht ist.

C ist nicht meine Muttersprache, damit ich vermute ich irgendwo einen stummen Anfänger Fehler haben.

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

Je nach Referenz Sie verwenden, ist es ziemlich offensichtlich, dass ein „b“ auf den Modus-Flag hinzuzufügen, ist die Antwort. Suche nach Nominierungen für den Armleuchter-Abzeichen. : -)

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

MSDN diskutiert nicht die binäre Flagge, bis der Mitte der Seite.

Opengroup erwähnt die Existenz des "b" Tag, aber stellt fest, dass es „keine Auswirkungen haben wird“.

War es hilfreich?

Lösung

vielleicht ist es eine Binär-Modus Ausgabe. Versuchen Sie das Öffnen der Datei mit "r+b" als Modus.

Bearbeiten . Wie in einem Kommentar "rb" festgestellt ist wahrscheinlich eine bessere Übereinstimmung zu Ihrer ursprünglichen Absicht seit "r+b" es bis zum Lesen öffnen / schreiben und "rb" ist schreibgeschützt

Andere Tipps

Auch erwähnenswert, dass einfach einschließlich binmode.obj in Ihrem Link-Befehl stellt fest, wird dies für Sie tun für alle Datei öffnet.

Eine Lösung auf der Grundlage der bisherigen Antworten:

    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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top