¿Cómo sabe fread cuando el archivo ha terminado en C?

2 minutos de lectura

avatar de usuario de user202925
usuario202925

Así que no estoy completamente seguro de cómo usar fread. Tengo un archivo binario en little-endian que necesito convertir a big-endian y no sé cómo leer el archivo. Esto es lo que tengo hasta ahora:

FILE *in_file=fopen(filename, "rb");
char buffer[4];
while(in_file!=EOF){
    fread(buffer, 4, 1, in_file);
    //convert to big-endian.
    //write to output file.
}

No he escrito nada más todavía, pero no estoy seguro de cómo hacer que fread ‘progrese’, por así decirlo. Cualquier ayuda sería apreciada.

  • ¡Completa el programa y ejecútalo! fread leerá desde donde se quedó la última vez que dio la vuelta al bucle. Debe comprobar el valor de retorno de fread. infile no es probable que se compare igual a EOF.

    – luser droog

    29 de marzo de 2013 a las 5:23


  • Por un lado, “rb” significa Rcabeza Binary, por lo que su matriz debe ser de tipo int, no char.

    – MarcusJ

    4 mayo 2015 a las 21:26

  • En realidad no estoy de acuerdo. La matriz debe ser chars. Los caracteres binarios son solo un byte, mientras que un número entero tiene 4 bytes. Entonces, en este caso, usar una matriz de caracteres sería una mejor representación porque un carácter representa un byte.

    – Ian Leaman

    27 de febrero de 2016 a las 21:07

avatar de usuario de user123
usuario123

Así no es como se lee correctamente de un archivo en C.

fread devuelve un size_t que representa el número de elementos leídos con éxito.

FILE* file = fopen(filename, "rb");
char buffer[4];

if (file) {
    /* File was opened successfully. */
    
    /* Attempt to read */
    while (fread(buffer, sizeof *buffer, 4, file) == 4) {
        /* byte swap here */
    }

    fclose(file);
}

Como puede ver, el código anterior dejaría de leer tan pronto como fread extrae cualquier cosa que no sean 4 elementos.

  • yo sugiero while (fread(buffer, 1, 4, file) == 4) { ... } para garantizar que se lean 4 bytes y evitar el comportamiento indefinido de usar valores no inicializados.

    – autista

    29 de marzo de 2013 a las 5:32


  • Gracias por mencionar eso. Me acabo de dar cuenta de que debería usar 1 para el tamaño y 4 para el conteo. Además, impresionante nombre hermano!

    – usuario123

    29 de marzo de 2013 a las 5:33


  • En efecto. No me había dado cuenta de eso, sin embargo. Mi comentario se refería a comparar explícitamente el valor de retorno con 4, en lugar de 0, porque si fread devolviera 3, 2 o 1, habría bytes no inicializados en el búfer, lo que daría como resultado un comportamiento indefinido si se usaran esos valores.

    – autista

    29 de marzo de 2013 a las 5:36


  • pero, ¿y si el archivo tiene, digamos, 4 caracteres?

    – molino_espacial

    7 de enero de 2022 a las 4:36

¿Ha sido útil esta solución?