Uso de la función fread: el tamaño que se va a leer es mayor que el disponible para leer

Tengo una pregunta:

Estoy usando fread para leer un archivo.

typedef struct {
    int ID1;
    int ID2;
    char string[256];
} Reg;

Reg *A = (Reg*) malloc(sizeof(Reg)*size);

size = FILESIZE/sizeof(Reg);

fread (A, sizeof(Reg), size, FILEREAD);

Usando un ciclo, llama consecutivamente a esta llamada, para hacerme leer todo mi archivo.

¿Qué sucederá cuando me acerque al final del archivo y no pueda leer "tamaño" * tamaño de (Reg), o si solo está disponible para leer la mitad de esta cantidad, qué sucederá con mi matriz A? Será ¿terminado? ¿La función devolverá un error?

¿Saber cómo leyó el archivo el fread-through?

Edi1: Exactamente, si la división no es exacta, cuando lea el último tamaño de archivo más pequeño que leeré cosas que no están en el archivo, me pregunto con mi vector cambiar el tamaño a la cantidad de bytes que puedo leer, o desarrollar una dinámica mejor.

preguntado el 22 de mayo de 12 a las 16:05

2 Respuestas

miedo devuelve el número de registros que leyó. Cualquier cosa más allá de eso en su búfer puede estar destrozada, no confíe en esos datos.

fread devuelve el número de elementos completos realmente leídos, que puede ser menor que contar si se produce un error o si se encuentra el final del archivo antes de llegar a contar.

La función no leerá más allá del final del archivo: lo más probable es que obtenga un montón de búferes completos y luego una lectura de búfer parcial (final), a menos que el tamaño del archivo sea un múltiplo exacto de la longitud de su búfer.

Su lógica debe adaptarse a esto: el tamaño del archivo le brinda la cantidad total esperada de registros, por lo que no debería ser difícil ignorar los datos finales en el búfer (después de la última fread llamada) que corresponde a registros no inicializados. Un contador de 'registros restantes para leer' sería un enfoque.

Respondido el 07 de Septiembre de 18 a las 09:09

"Cualquier cosa más allá de eso en su búfer no se modificará". Creo que esto debería ser "Cualquier cosa más allá de eso en su búfer será inválida/indeterminada" - evan benn

@Evan Benn lo que dijo no siempre es cierto: las lecturas se realizan en un bucle, si se lee más de un registro, se conocen los datos al final del búfer. - Steve Townsend

If a partial member is read, its value is indeterminate. - Si bien no está claro, me parece que la implementación es libre de cambiar datos de un miembro más allá de los miembros válidos que devuelve. - evan benn

Confirmé que en mi caja, los datos de la matriz se superponen a los elementos de lectura 'válidos'. - evan benn

fread() devuelve el número de elementos que podría leer. Así que tienes que comprobar el valor de retorno de fread() para averiguar cuántos elementos de su matriz son válidos.

Devolverá un recuento corto de elementos o cero si se produjo un error o EOF se ha alcanzado. tendrás que usar feof() parte ferror() en este caso para comprobar qué condición se cumple.

contestado el 22 de mayo de 12 a las 16:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.