Pregunta sobre c, fread, file – ¿Fread mueve el puntero del archivo?

15

Pregunta simple,

Cuando uso fread:

fread(ArrayA, sizeof(Reg), sizeBlock, fp);

Mi puntero de archivo,fp se mueve hacia adelante?

Tu respuesta

4   la respuesta
29

la llamada a fread realmente mueve el puntero del archivo. El puntero del archivo avanzará según el número de bytes realmente leídos. En caso de un error en fread, la posición del archivo después de llamar a fread no está especificada.

23

Responder: Sí, la posición del puntero del archivo se actualiza automáticamente después de la operación de lectura, de modo quefread() Las funciones leen sucesivos registros de archivos.

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 secuencia apuntada porstream y coloca los bytes leídos en la matriz apuntada porptr, Dejará de leer cuando se cumpla alguna de las siguientes condiciones:

Ha leídolimit elementos de tamañosizeoLlega al final del archivo, oSe produce un error de lectura.

fread() te da tanto control comofgetc(), y tiene la ventaja de poder leer más de un carácter en una sola operación de E / S. De hecho, si la memoria lo permite, puede leer todo el archivo en una matriz y hacer todo el procesamiento en la memoria. Esto tiene importantes ventajas de rendimiento.

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

Bueno, no estaría de más incluir una explicación de eso en tu respuesta también. David Heffernan
Esta respuesta no responde realmente a la pregunta que se hizo, que es simplemente lo que sucede con el puntero del archivo después de llamar a fread David Heffernan
@DavidHeffernan: por favor vea la edición ... Addicted
He invertido el orden, para reflejar los pensamientos expresados ​​aquí en los comentarios. La respuesta fue en realidad la pequeña sección "editar" al final. Espero que el cambio mejore la experiencia de los lectores cuando busquen una respuesta. Dr Beco
2

fp Se avanzará por la cantidad total de bytes leídos.
En tu caso la función.temible leesizeBlock objetos, cada unosizeof(Reg) bytes de longitud, desde la secuencia apuntada porfp, almacenándolos en el lugar dado porArrayA.

0

Si lo hace Se puede verificar usandoftell () Para mostrar la posición actual (de hecho, los bytes leídos hasta ahora), échale un vistazo:

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

Preguntas relacionadas