2012-05-22 23 views

Respuesta

18

Respuesta: Sí, la posición del puntero del archivo se actualiza automáticamente después de la operación de lectura, por lo que los sucesivos fread() funciones leen registros del archivo sucesivos.

Aclaración:fread() es una función orientada a bloques. El prototipo estándar es:

size_t fread(void *ptr, 
      size_t size, 
      size_t limit, 
      FILE *stream); 

La función lee de la corriente a la que apunta stream y coloca los bytes leídos en el array apuntado por ptr, se detendrá la lectura cuando cualquiera de las condiciones siguientes:

  • se ha leído limit elementos de tamaño size, o
  • se alcanza el final del archivo, o
  • una lectura se produce error.

fread() le da el máximo control fgetc(), y tiene la ventaja de ser capaz de leer más de un carácter en una única operación de E/S. De hecho, si la memoria lo permite, puede leer todo el archivo en una matriz y hacer todo su procesamiento en la memoria. Esto tiene importantes ventajas de rendimiento.

fread() se usa a menudo para leer registros de datos de longitud fija directamente en estructuras, pero puede usarlos para leer cualquier archivo. Es mi elección personal para leer la mayoría de los archivos de disco.

+0

Ah, gracias por la respuesta. Me preguntaba qué tendría que usar fseek para reposicionar el puntero del archivo. – Richard

+12

Esta respuesta no responde a la pregunta que se hizo, que es simplemente lo que sucede con el puntero del archivo después de llamar a fread –

+0

, según mi entendimiento, él pidió claridad sobre por qué está sucediendo ..... – Addicted

28

Sí, al llamar a fread sí se mueve el puntero del archivo. El puntero del archivo se avanzará por la cantidad de bytes que realmente se leen. En caso de error en fread, la posición del archivo después de llamar a fread no está especificada.

2

Sí, el fp se adelantará por la cantidad total de bytes leídos.
En su caso, la función FREAD lee sizeBlock objetos, cada uno sizeof(Reg) bytes de longitud, de la corriente a la que apunta fp, almacenándolos en el sitio apuntado por ArrayA.

0

Sí, lo hace. Se pudo comprobar mediante el uso de la función ftell() con el fin de mostrar la posición actual (de hecho, bytes leídos hasta el momento), echar un vistazo que:

int main() { 

    typedef struct person { 
     char *nome; int age; 
    } person; 

    // write struct to file 2x or more... 

    FILE *file = fopen(filename, "rb"); 
    person p; 
    size_t byteslength = sizeof(struct person); 

    printf("ftell: %ld\n", ftell(file)); 
    fread(&p, byteslength, 1, file); 
    printf("name: %s | age: %d\n", p.nome, p.idade); 

    printf("ftell: %ld\n", ftell(file)); 
    fread(&p, byteslength, 1, file); 
    printf("name: %s | age: %d\n", p.nome, p.idade); 

    //... 

    fclose(file); 

    return 0; 
} 
Cuestiones relacionadas