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