Pregunta

Estoy intentando leer desde un archivo en un desplazamiento (versión simplificada) específica:

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

El problema se hace, que los datos no contendrá 1008 bytes, pero 529 (parece aleatorio). Cuando llega a 529 bytes, llamadas a feof (data_fp) empezará a devolver cierto.

También he intentado leer en trozos más pequeños (8 bytes a la vez), pero sólo se ve como si estuviera golpeando EOF cuando no está allí todavía.

Una simple mirada en un hexágono espectáculos editor hay un montón de bytes dejó .

¿Fue útil?

Solución

La apertura de un archivo en modo de texto, al igual que está haciendo, hace que la biblioteca de traducir algunos de los contenidos de los archivos a otras cosas, lo que podría desencadenar un EOF injustificada o malos cálculos de compensación.

Abrir el archivo en modo binario pasando la opción "b" a la llamada fopen

fopen(filename, "rb");

Otros consejos

es el archivo se escribe en forma paralela por alguna otra aplicación? Tal vez hay una condición de carrera, de modo que los extremos de archivo en donde se detiene la lectura, cuando la lectura se está ejecutando, pero más tarde, cuando se inspecciona que el resto se ha escrito. Eso explicaría la aleatoriedad, también.

Tal vez sea una diferencia entre texto y archivos binarios. Si estás en Windows, los saltos de línea son CRLF, que es de dos caracteres en el archivo, pero convertidos en una sola cuando se lee. Trate de usar fopen (..., "rb")

No puedo ver tu enlace de trabajo, pero si existen sus reclamaciones de ordenador sin más bytes, me tienden a creer. ¿Por qué no se imprime el tamaño del archivo en vez de hacer las cosas a mano en un editor hexadecimal?

Además, sería mejor usar el nivel 2 de E / S los F-llamadas son antiguos fealdad C, y está usando C ++ ya que tienes nuevo.

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

Ahora hacer su búsqueda y la lectura usando el nivel 2 de E / S llamadas, que son más rápidos de todos modos, y veamos cuál es el tamaño del archivo realmente es.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top