Domanda

Sto cercando di leggere da un file a un offset (versione semplificata) specifica:

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

Il problema diventa, che i dati non conterrà 1008 byte, ma 529 (sembra casuale). Quando raggiunge 529 byte, chiama a feof (data_fp) inizierà restituendo vero.

Inoltre ho provato a leggere in blocchi più piccoli (8 byte alla volta), ma sembra proprio come se fosse colpire EOF quando non c'è ancora.

Un semplice sguardo in un esagono editor visualizza ci sono un sacco di byte sinistra.

È stato utile?

Soluzione

Apertura di un file in modalità testo, come si sta facendo, rende la libreria tradurre alcuni dei contenuti di file da altre cose, potenzialmente innescando un'EOF ingiustificata o calcoli di offset cattivi.

Apri il file in modalità binaria passando l'opzione "b" alla chiamata fopen

fopen(filename, "rb");

Altri suggerimenti

è il file in fase di scrittura in parallelo da qualche altra applicazione? Forse c'è una condizione di competizione, in modo che le estremità dei file a ovunque lettura si ferma, quando la lettura è in esecuzione, ma più tardi, quando si controlla che tutto il resto è stato scritto. Questo spiegherebbe la casualità, anche.

Forse è una differenza tra testuale e file binario. Se siete su Windows, a capo sono CRLF, che è di due caratteri nel file, ma convertiti in uno solo quando viene letto. Provare a utilizzare fopen (..., "RB")

Non riesco a vedere il tuo link dal lavoro, ma se esistono le attestazioni di computer non più byte, mi piacerebbe tendono a crederci. Perché non stampare la dimensione del file, piuttosto che fare le cose a mano in un editor esadecimale?

Inoltre, si sarebbe meglio utilizzare il livello 2 di I / O gli F-chiamate sono antiche bruttezza C, e si sta utilizzando C ++ da quando si dispone di nuovi.

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

Ora fare la tua ricerca e il leggere utilizzando il livello 2 di I / O chiamate, che sono più veloci in ogni caso, e vediamo che cosa la dimensione del file davvero è.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top