Simple pregunta,

Cuando yo uso fread:

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

Mi puntero de archivo, fp se mueve por delante?

OriginalEl autor Richard | 2012-05-22

4 Comentarios

  1. 23

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

    Aclaración: fread() es un bloque orientado a la función. El estándar prototipo es:

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

    La función lee el stream apuntado por stream y lugares que los bytes leídos en el array apuntado por ptr, va a dejar de leer cuando alguna de las condiciones siguientes son verdaderas:

    • Ha leído limit elementos de tamaño size, o
    • Se alcanza el final del archivo, o
    • Un error de lectura que se produce.

    fread() da tanto control como fgetc(), y tiene la ventaja de ser capaz de leer más de un carácter en una sola operación de e/S. De hecho, la memoria lo permite, se puede leer todo el archivo en un array y hacer todo de su procesamiento en la memoria. Esto tiene importantes ventajas de rendimiento.

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

    Ah, gracias por la respuesta. Me preguntaba qué tendría que utilizar el fseek para cambiar la posición del puntero de archivo.
    Esta respuesta no es en realidad la dirección de la pregunta que se le preguntó, que es simplemente lo que sucede con el puntero de archivo después de llamar a fread
    de acuerdo a mi entendimiento, pidió claridad de por qué está sucediendo…..
    Su respuesta debe comenzar con un «Sí» para responder a la pregunta del título.
    He invertido el orden, para reflejar las ideas expresadas aquí en los comentarios. La respuesta fue en realidad el pequeño «editar» en la sección final. Espero que el cambio va a mejorar la experiencia del lector cuando la búsqueda de una respuesta.

    OriginalEl autor Addicted

  2. 29

    Sí, llamando fread de hecho mover el puntero de archivo. El puntero de archivo se avanza por el número de bytes a leer. En caso de un error en fread, la posición del archivo después de llamar a fread es indeterminado.

    OriginalEl autor David Heffernan

  3. 2

    Sí, La fp que será desarrollada por la cantidad total de bytes leídos.

    En el caso de que la función fread lee sizeBlock objetos, cada uno de sizeof(Reg) bytes de longitud, desde el stream apuntado por fp, guardarlos en la ubicación dada por ArrayA.

    OriginalEl autor Jainendra

  4. 0

    Sí, sí. Podría ser comprobada mediante el uso de ftell() función para mostrar la posición actual (de hecho, los bytes leídos hasta el momento), echa 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;
    }

    OriginalEl autor felipsmartins

Dejar respuesta

Please enter your comment!
Please enter your name here