Soy bastante nuevo en C, pero me he encontrado un problema con fread…

Mi objetivo final es leer (y luego printf para la consola) el binario de un .archivo bin, pero por ahora me estoy tomando un paso a la vez y tratando de que acaba de leer el primer bit…

Mi código:

...
FILE *file = fopen("test1.bin", rb);
int i = 0;
fread(&i, 1, 1, file);
printf("%i\n", i);
...

Ahora he probado esto en tres diferentes .archivos bin, uno arrojan como resultado 0, otros 2 y los otros 12!

¿Por qué es generar 2/12 cuando estoy leyendo en sólo un 1 bit de archivo? No debe ser un 0 o un 1? ¿qué estoy haciendo mal? Gracias mucho.

  • Usted está leyendo byte 1, no 1 bit. 🙂
  • Correcto, bien gracias, así que si quería leer solo 32 bits, me gustaría cambiar 1, 1 4, 1?
  • Mejor cambiar a sizeof(int),1.

2 Comentarios

  1. 6

    Cambiar el fread() llame a:

    fread(&i, sizeof(int), 1, file);

    El segundo argumento es el tamaño de un elemento a leer, el tercer argumento es el número de elementos a leer. El nuevo código es la lectura de un solo byte en un int.

    Usted debe también comprobar los valores de retorno de fopen() y fread() llamadas para asegurarse de que fueron un éxito.

  2. 1

    Como @hmjd dijo, usted debe leer el número de bytes necesarios para llenar un int valor. Por lo que sea de esta manera:

    len = fread(&i, sizeof(int), 1, file);

    o de esta manera:

    len = fread(&i, 1, sizeof(int), file);

    El primer caso, se lee en uno int valor (normalmente como 4 bytes). Después de la llamada, len debe ser igual a 1 si la lectura éxito.

    El segundo caso se lee varios bytes en un int valor. La diferencia es que después de esta llamada, len debe ser igual a sizeof(int).

    De cualquier manera va a trabajar, con la única diferencia de que la primera forma especifica de la lectura de un múltiple de byte único objeto (un int), mientras que el segundo especifica el número de bytes a leer en el objeto. Es una diferencia sutil, y la gente está de acuerdo que es mejor, por supuesto.

    La ventaja del segundo método es que len se indica el número de bytes realmente leer (que podría ser útil para la depuración de errores de e/S). La ventaja del primer método es que es conceptualmente más simple prueba para el éxito (fue uno int leer o no?).

    Pero no importa cómo se haga, siempre se debe comprobar el valor de retorno de fread().

Dejar respuesta

Please enter your comment!
Please enter your name here