Перемещает ли файл указатель на файл?

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

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

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

Мой указатель файла, fp перемещен вперед?

Ответы

Ответ 1

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

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

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

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

  • Он прочитал limit элементы размера size или
  • Он доходит до конца файла или
  • Произошла ошибка чтения.

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

Да, да. Его можно проверить, используя 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;
}