Простой вопрос,
Когда я использую fread:
fread(ArrayA, sizeof(Reg), sizeBlock, fp);
Мой указатель файла, fp
перемещен вперед?
Простой вопрос,
Когда я использую fread:
fread(ArrayA, sizeof(Reg), sizeBlock, fp);
Мой указатель файла, fp
перемещен вперед?
Ответ: Да, позиция указателя файла автоматически обновляется после операции чтения, так что последовательные функции fread()
читают последовательные записи файлов.
Разъяснение: fread()
- это блок-ориентированная функция. Стандартный прототип:
size_t fread(void *ptr,
size_t size,
size_t limit,
FILE *stream);
Функция читает из потока, на который указывает stream
, и помещает байты в массив, на который указывает ptr
. Он перестает читать, когда выполняется любое из следующих условий:
limit
элементы размера size
или fread()
предоставляет вам такой же контроль, как fgetc()
, и имеет то преимущество, что он может читать более одного символа в одной операции ввода-вывода. Фактически, если позволяет память, вы можете прочитать весь файл в массиве и выполнить всю свою обработку в памяти. Это имеет значительные преимущества в производительности.
fread()
часто используется для чтения записей фиксированной длины непосредственно в structs, но вы можете использовать его для чтения любого файла. Это мой личный выбор для чтения большинства дисковых файлов.
Да, вызов fread действительно перемещает указатель файла. Указатель файла будет увеличен на количество фактически прочитанных байтов. В случае ошибки в fread позиция файла после вызова fread не указана.
Да, fp
будет увеличен на общее количество прочитанных байтов.
В вашем случае функция fread читает sizeBlock
объекты, каждый длиной sizeof(Reg)
байтов, из потока, на который указывает fp
, сохраняя их в месте, указанном ArrayA
.
Да, да. Его можно проверить, используя 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;
}