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.
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
¡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 defread
.infile
no es probable que se compare igual aEOF
.– 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