Pregunta

Estoy escribiendo una biblioteca C que lee un archivo en la memoria. Omite 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 termina porque se alcanza el EOF (sin errores). Al final, bytesRead = 10624, ftell (stream) = 28726, y el búfer contiene 28726 valores. Espero que fread lea 30,000 bytes y que la posición del archivo sea 30054 cuando se alcanza EOF.

C no es mi lengua materna, por lo 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 " a la bandera de modo es la respuesta. Buscando nominaciones para la insignia de bonehead. :-)

Esta referencia habla de ello en el segundo párrafo, segunda oración (aunque no en su tabla).

MSDN no analiza el binario bandera hasta la mitad de la página.

OpenGroup menciona la existencia de " b " etiqueta, pero establece que " no tendrá efecto " ;.

¿Fue útil?

Solución

tal vez es un problema de modo binario. Intente abrir el archivo con " r + b " como modo.

EDITAR : como se indica en un comentario " rb " es probable que coincida mejor con su intención original ya que " r + b " lo abrirá para lectura / escritura y " rb " es de solo lectura.

Otros consejos

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top