Tengo un gran problema que necesita ser resuelto antes de que pueda continuar con mi programa.

Tengo que abrir un archivo binario, leer su contenido, guardar el contenido en un buffer, asignar espacio en el montón con malloc, cierre el archivo y finalmente printf( el contenido de la .archivo bin). Me llegó esta lejos (de cerrar el archivo no está implementado aún):

void executeFile(char *path){
    FILE *fp; /*filepointer*/
    size_t size; /*filesize*/
    unsigned int buffer []; /*buffer*/

    fp = fopen(path,"rb"); /*open file*/
    fseek(fp, 0, SEEK_END); 
    size = ftell(fp);         /*calc the size needed*/
    fseek(fp, 0, SEEK_SET); 
    buffer = malloc(size);  /*allocalte space on heap*/

    if (fp == NULL){ /*ERROR detection if file == empty*/
        printf("Error: There was an Error reading the file %s \n", path);           
        exit(1);
    }
    else if (fread(&buffer, sizeof(unsigned int), size, fp) != size){ /* if count of read bytes != calculated size of .bin file -> ERROR*/
        printf("Error: There was an Error reading the file %s - %d\n", path, r);
        exit(1);
    }else{int i;
        for(i=0; i<size;i++){       
            printf("%x", buffer[i]);
        }
    }
}

Creo que he metido hasta el búfer y no estoy realmente seguro de si he leído el .archivo bin correctamente porque no puedo imprimir con printf("%x", buffer[i])

Espero que les puede ayudar a

Saludos desde alemania 🙂

Donde se size que se establece? Te lo han comentado.
Sólo para el caso de cuando las cosas no funcionan perfectamente (como, a la derecha ahora, por ejemplo), puede que desee considerar la posibilidad de la comprobación de que el valor de retorno de las funciones de llamar a. fopen(), malloc(), fseek().. Ninguno se comprueban, a pesar de que el tiempo de verificación para fp == NULL, pero sólo después de que usted ciegamente fseek() en él, y el NULO control parece ser un archivo de verificación vacía (que no es correcto), en lugar de fracaso-para-abrir. Lea la documentación de la biblioteca.
Comentó size a cabo por accidente->fijo
Empecé a escribir una respuesta detallada, pero acaba de hacer esto: (1) Compruebe los valores de retorno, (2) Cambiar el buffer de tipo base unsigned char *buffer;. (3) Revisión fread() llamada a pasar buffer como el primer parámetro (no &buffer), y sizeof(buffer[0]) como el segundo. y, finalmente, (4) cierre el archivo con fclose() y libre de su búfer con free(). Opcional comprobación de size == 0 antes de entrar en la lectura y la impresión que me dejo.
También tenga en cuenta que fstat() podría ser una mejor manera de determinar el tamaño de archivo de múltiples fseek() llamadas…

OriginalEl autor user2418126 | 2013-05-24

1 Comentario

  1. 7

    Los cambios recomendados:

    1) Cambiar el buffer a un char (byte), como el ftell() le informe el tamaño en bytes (char) y malloc() utilizar el byte de tamaño también.

    unsigned int buffer []; /*buffer*/

    a

    unsigned char *buffer; /*buffer*/

    2) Este es ACEPTAR, es el tamaño de bytes del búfer y los puntos de a bytes, pero podría ser explícitamente

    buffer = malloc(size);  /*allocate space on heap*/

    a

    buffer = (unsigned char *) malloc(size);  /*allocate space on heap*/
    /* or for those who recommend no casting on malloc() */
    buffer = malloc(size);  /*allocate space on heap*/

    3) cambiar el 2do parámetro de sizeof(unsigned int) a sizeof *buffer, que es de 1.

    else if (fread(buffer, sizeof(unsigned int), size, fp) != size){

    a

    else if (fread(buffer, sizeof *buffer, size, fp) != size){ 

    4) Cambio "%x" a "%02x" más de un solo dígito hexadecimal los números se debe confundir el de salida. E. g. es «1234» cuatro bytes o dos?

    printf("%x", buffer[i]);

    a

    printf("%02x", buffer[i]);

    5) la limpieza al final de la función puede incluir

    fclose(fp);
    free(buffer);
    Usted no puede utilizar una matriz vacía obligado como que dentro de una función (ACEPTAR en una lista de argumentos). Y no se puede asignar a una matriz como la malloc() hace. Debe ser unsigned int *buffer;.
    sí, él se quejaba de la matriz vacía atado … el programa no sabe lo grande que es el buffer tiene que ser porque no sabe lo que el tamaño del archivo …
    Leffler : se ha corregido la solución de «unsigned int buffer[]» a «unsigned char *buffer».
    Re #3, ¿no se supone que ser fread(buffer, ...)?
    ¿Por qué sí lo es! Código modificado.

    OriginalEl autor chux

Dejar respuesta

Please enter your comment!
Please enter your name here