简单的问题,
当我使用 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 的元素size
,或 fread()
为您提供与 一样多的控制权fgetc()
,并且具有能够在单个 I/O 操作中读取多个字符的优势。事实上,如果内存允许,您可以将整个文件读入一个数组并在内存中进行所有处理。这具有显着的性能优势。
fread()
通常用于将固定长度的数据记录直接读取到结构中,但您可以使用它来读取任何文件。这是我个人阅读大多数磁盘文件的选择。
是的,调用 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;
}