fread函数会移动文件指针吗?

22

简单的问题,

当我使用fread函数:

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

我的文件指针fp被移到了前面?

4个回答

36

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

说明: fread()是一个块定向函数。标准的原型是:

size_t fread(void *ptr,
             size_t size,
             size_t limit,
             FILE *stream);
该函数从指向stream的流中读取,将读取的字节放入指向ptr的数组中。当满足以下任一条件时,它将停止读取:
  • 已经读取了size大小的limit个元素,或者
  • 到达文件结尾,或者
  • 发生读取错误。
fread()提供与fgetc()同样多的控制,具有能够在单个I/O操作中读取多个字符的优势。实际上,在内存允许的情况下,可以将整个文件读入数组中,并在内存中进行所有处理。这具有显着的性能优势。 fread()通常用于直接将定长数据记录读入结构体中,但您也可以使用它来读取任何文件。对于读取大多数磁盘文件,这是我的个人选择。

啊,谢谢回复。我在想如果要重新定位文件指针会不会需要使用 fseek。 - richardaum
13
这个回答实际上并没有回答所问的问题,即调用fread后文件指针会发生什么。 - David Heffernan
把那个解释也包含在你的回答里也无妨。 - David Heffernan
7
你的回答应该以“是”开头,以回答标题中的问题。 - mrks
1
我已经倒转了顺序,以反映在评论中表达的思想。答案实际上是最后的小“编辑”部分。我希望这个改变能够提高读者在寻找答案时的体验。 - DrBeco

31

是的,调用fread确实会移动文件指针。文件指针将会被实际读取的字节数所推进。在fread出现错误时,调用后的文件位置是未指定的。


2
是的,fp 将会被移动读取的总字节数。
在您的情况下,函数 fread 从指向 fp 的流中读取 sizeBlock 个对象,每个对象的长度为 sizeof(Reg) 字节,将它们存储在给定的位置 ArrayA

1
是的,它可以。可以使用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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接