Frage

Ich versuche, aus einer Datei zu einer bestimmten Offset (vereinfachte Version) zu lesen:

typedef unsigned char u8;
FILE *data_fp = fopen("C:\\some_file.dat", "r");
fseek(data_fp, 0x004d0a68, SEEK_SET); // move filepointer to offset
u8 *data = new u8[0x3F0];
fread(data, 0x3F0, 1, data_fp);
delete[] data;
fclose(data_fp);

Das Problem wird, werden die Daten enthalten, nicht 1008 Bytes, aber 529 (scheint zufällig). Wenn es 529 Bytes erreicht, Anrufe zu feof (data_fp) beginnt wahr zurück.

Ich habe auch versucht, in kleineren Stücken (zu einer Zeit 8 Byte) zu lesen, aber es sieht aus wie es EOF ist schlagen, wenn es noch nicht da.

Ein einfacher Blick in einem Hex-Editor zeigt gibt es viele Bytes links.

War es hilfreich?

Lösung

eine Datei im Textmodus öffnen, wie Sie tun, macht die Bibliothek einige der Dateiinhalte auf andere Sachen übersetzen, möglicherweise eine unberechtigte EOF oder schlecht Offset-Berechnungen auslösen.

Öffnen Sie die Datei in Binär-Modus, indem Sie die „b“ Option zum fopen Aufruf übergeben

fopen(filename, "rb");

Andere Tipps

Ist die Datei von einer anderen Anwendung zu parallel geschrieben werden? Vielleicht gibt es eine Race-Bedingung, so dass die Datei endet an, wo die Lese stoppt, wenn die Lese läuft, aber später, wenn Sie es überprüfen der Rest geschrieben wurde. Das wäre die Zufälligkeit erklären, auch.

Vielleicht ist es ein Unterschied zwischen Text- und Binärdatei. Wenn Sie unter Windows sind, sind Zeilenumbrüche CRLF, die zwei Zeichen in der Datei ist, sondern nur auf eine umgewandelt, wenn sie gelesen. Versuchen Sie es mit fopen (..., "rb")

Ich kann nicht Ihren Link von der Arbeit sehen, aber wenn Ihr Computer Ansprüchen nicht mehr Bytes vorhanden ist, würde ich es zu glauben, neigt. Warum Sie nicht über die Größe der Datei drucken, anstatt die Dinge mit der Hand in einem Hex-Editor tun?

Auch würden Sie besser dran, 2 mit Level I / O die f-Anrufe sind alte C Hässlichkeit, und Sie sind mit C ++, da Sie neue haben.

int fh =open(filename, O_RDONLY);
struct stat s;
fstat(fh, s);
cout << "size=" << hex << s.st_size << "\n";

Jetzt ist Ihre seeking tun und das Lesen mit Stufe 2 E / A-Anrufe, die schneller sind sowieso, und mal sehen, was die Größe der Datei wirklich ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top