Вопрос по fread, c, file – Fread перемещает указатель файла?

15

Простой вопрос,

Когда я использую Fread:

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

Мой указатель файла,fp продвигается?

Ваш Ответ

4   ответа
23

Answer: Да, позиция указателя файла обновляется автоматически после операции чтения, так что последовательноfread() функции чтения последовательных файловых записей.

Clarification: fread() является блок-ориентированной функцией. Стандартный прототип:

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

Функция читает из потока, на который указываетstream и помещает байты в массив, на который указываетptr, Он прекратит чтение, если выполнено любое из следующих условий:

  • It has read limit elements of size size, or
  • It reaches the end of file, or
  • A read error occurs.

fread() дает вам столько же контроля, сколькоfgetc()Преимущество заключается в возможности чтения более одного символа за одну операцию ввода-вывода. На самом деле, если позволяет память, вы можете прочитать весь файл в массив и выполнить всю вашу обработку в памяти. Это имеет значительные преимущества в производительности.

fread() часто используется для чтения записей данных фиксированной длины непосредственно в структуры, но вы можете использовать его для чтения любого файла. Это мой личный выбор для чтения большинства файлов на диске.

Этот ответ на самом деле не отвечает на заданный вопрос, а именно то, что происходит с указателем файла после вызова fread.
Ваш ответ должен начинаться с "Да" ответить на вопрос из заголовка.
Ах, спасибо за ответ. Мне было интересно, что бы использовать fseek, чтобы изменить положение указателя файла. Richard
Я перевернул порядок, чтобы отразить мысли, высказанные здесь в комментариях. Ответ на самом деле был маленьким & quot; изменить & quot; раздел в конце. Я надеюсь, что это изменение улучшит опыт читателей при поиске ответа.
по моему пониманию он попросил прояснить почему это происходит .....
0

Да, это так. Это можно проверить с помощьюftell () Функция для того, чтобы показать текущую позицию (на самом деле, пока прочитано байтов), взгляните на нее:

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

Да,fp будет увеличен на общее количество прочитанных байтов.
В вашем случае функцияfread читаетsizeBlock объекты, каждыйsizeof(Reg) длиной в байтах от потока, на который указываетfp, храня их в месте, указанномArrayA.

29

Да, вызов fread действительно перемещает указатель файла. Указатель файла будет увеличен на количество фактически прочитанных байтов. В случае ошибки в fread, позиция файла после вызова fread не указывается.

Похожие вопросы