【发布时间】:2012-05-28 15:18:37
【问题描述】:
简单的问题,
当我使用 fread 时:
fread(ArrayA, sizeof(Reg), sizeBlock, fp);
我的文件指针fp 向前移动了?
【问题讨论】:
简单的问题,
当我使用 fread 时:
fread(ArrayA, sizeof(Reg), sizeBlock, fp);
我的文件指针fp 向前移动了?
【问题讨论】:
是的,调用 fread 确实会移动文件指针。文件指针将按实际读取的字节数前进。 fread出错时,调用fread后的文件位置是未指定的。
【讨论】:
答案:是的,文件指针的位置在读取操作后会自动更新,以便连续的fread()函数读取连续的文件记录。
澄清: fread() 是一个面向块的函数。标准原型是:
size_t fread(void *ptr,
size_t size,
size_t limit,
FILE *stream);
函数从stream指向的流中读取,并将读取到的字节放入ptr指向的数组中,当满足以下任一条件时,将停止读取:
limit 大小为size 的元素,或fread() 为您提供与fgetc() 一样多的控制权,并且具有能够在单个 I/O 操作中读取多个字符的优势。事实上,如果内存允许,您可以将整个文件读入一个数组并在内存中进行所有处理。这具有显着的性能优势。
fread() 通常用于将固定长度的数据记录直接读取到结构中,但您可以使用它来读取任何文件。这是我个人阅读大多数磁盘文件的选择。
【讨论】:
是的,fp 将按读取的总字节数提前。
在您的情况下,函数 fread 从fp 指向的流中读取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;
}
【讨论】: