fread会移动文件指针吗?

简单的问题,

当我使用fread时:

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

我的文件指针, fp向前移动?

答:是的,文件指针的位置在读取操作后自动更新,以便连续的fread()函数读取连续的文件记录。

澄清: fread()是一个面向块的函数。 标准原型是:

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

该函数从stream指向的stream读取并将读取的字节放入ptr指向的数组中,当满足以下任一条件时,它将停止读取:

  • 它具有读取尺寸size limit元素,或
  • 它到达文件的末尾,或
  • 发生读取错误。

fread()为您提供与fgetc()一样多的控制权,并且具有能够在单个I / O操作中读取多个字符的优点。 事实上,在内存允许的情况下,您可以将整个文件读入数组并在内存中完成所有处理。 这具有显着的性能优势。

fread()通常用于将固定长度的数据记录直接读入结构体,但您可以使用它来读取任何文件。 这是我个人选择阅读大多数磁盘文件。

是的,调用fread确实会移动文件指针。 文件指针将按实际读取的字节数提前。 如果fread出错,则调用fread后的文件位置未指定。

是的, fp将按读取的总字节数提前。
在你的情况下,函数freadfp指向的流中读取sizeBlock对象,每个sizeof(Reg)字节长,将它们存储在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; }