Utilizando la función fread:tamaño para ser leído es mayor que el disponible para la lectura

StackOverflow https://stackoverflow.com//questions/10705158

  •  13-12-2019
  •  | 
  •  

Pregunta

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);

El uso de un bucle, de forma consecutiva convocatoria la presente convocatoria, para que me lea toda mi archivo.

¿Qué pasará cuando llego cerca del final del archivo, y no puedo leer "tamaño" * sizeof (Registro), o si sólo están disponibles para leer la mitad de esta cantidad, ¿qué pasará con mi matriz A.Será completado?La función devolverá un error?

Conocer cómo puede el archivo fue leído por el fread a través de?

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

¿Fue útil?

Solución

Fread Devuelve el número de registros que leen.Cualquier cosa más allá de eso, en su búfer, puede ser destruido, no confíe en esos datos.

Fread Fread devuelve el número de elementos completos en realidad, que pueden ser Menos que contar si se produce un error o si el final del archivo es encontrado antes de llegar a la cuenta.

La función no leerá más allá del final del archivo: la ocurrencia más probable es que obtendrá un montón de buffers completos y luego se lea un búfer parcial (final), a menos que el tamaño del archivo sea exacto de su búfer.largo.

Su lógica necesita para adaptarse a esto: el tamaño del archivo le brinda el número total esperado de registros, por lo que no debería ser difícil ignorar los datos de arrastre en el búfer (después de la llamada final de fread) que corresponda a registros no inicializados.Un contador de "registros restantes para leer" sería un enfoque.

Otros consejos

fread() devuelve el número de elementos que se podían leer.Así que usted tiene que comprobar el valor de retorno de fread() para averiguar cuántos elementos de la matriz son válidos.

Se devolverá un corto número de elementos o cero si se ha producido un error o EOF se ha alcanzado.Usted tendrá que usar feof() ond ferror() en este caso para comprobar lo que se cumple la condición.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top