c++ - lenguaje - manejo de archivos en c pdf
¿Por qué es fread llegar al EOF temprano? (3)
Estoy escribiendo una biblioteca C que lee un archivo en la memoria. Salta los primeros 54 bytes del archivo (encabezado) y luego lee el resto como datos. Utilizo fseek para determinar la longitud del archivo, y luego uso fread para leer en el archivo.
El ciclo se ejecuta una vez y luego finaliza porque se alcanza el EOF (sin errores). Al final, bytesRead = 10624, ftell (stream) = 28726, y el buffer contiene 28726 valores. Espero que haya leído 30,000 bytes y que la posición del archivo sea 30054 cuando se alcance el EOF.
C no es mi lengua materna, así que sospecho que tengo un error tonto de principiante en alguna parte.
El código es el siguiente:
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;
}
Dependiendo de la referencia que use, es bastante evidente que agregar una "b" al indicador de modo es la respuesta. Buscando nominaciones para el bonehead-badge. :-)
Esta referencia habla sobre esto en el segundo párrafo, segunda oración (aunque no en su tabla).
MSDN no analiza el indicador binario hasta la mitad de la página.
OpenGroup menciona la existencia de la etiqueta "b", pero establece que "no tendrá ningún efecto".
También vale la pena señalar que simplemente incluir binmode.obj en su comando de enlace hará esto por usted para todos los archivos abiertos.
Una solución, basada en las respuestas anteriores:
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;
}
tal vez es un problema de modo binario. Intente abrir el archivo con "r+b"
como el modo.
EDITAR : como se señala en un comentario, "rb"
es probablemente una mejor coincidencia con su intención original ya que "r+b"
lo abrirá para lectura / escritura y "rb"
es de solo lectura.