简单的问题,
当我使用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
的数组中。当满足以下任一条件时,它将停止读取:
size
大小的limit
个元素,或者fread()
提供与fgetc()
同样多的控制,具有能够在单个I/O操作中读取多个字符的优势。实际上,在内存允许的情况下,可以将整个文件读入数组中,并在内存中进行所有处理。这具有显着的性能优势。
fread()
通常用于直接将定长数据记录读入结构体中,但您也可以使用它来读取任何文件。对于读取大多数磁盘文件,这是我的个人选择。是的,调用fread确实会移动文件指针。文件指针将会被实际读取的字节数所推进。在fread出现错误时,调用后的文件位置是未指定的。
fp
将会被移动读取的总字节数。fp
的流中读取 sizeBlock
个对象,每个对象的长度为 sizeof(Reg)
字节,将它们存储在给定的位置 ArrayA
。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;
}