22

简单的问题,

当我使用 fread 时:

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

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

4

4 回答 4

33

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

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

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

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

  • 它已读取limitsize 的元素size,或
  • 它到达文件的末尾,或者
  • 发生读取错误。

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

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

于 2012-05-22T06:35:25.280 回答
30

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

于 2012-05-22T06:32:11.220 回答
2

是的,fp将按读取的字节总数提前。
在您的情况下,函数fread从 指向的流中读取sizeBlock每个字节长的对象,并将它们存储在 给定的位置。sizeof(Reg)fpArrayA

于 2012-05-22T06:36:34.607 回答
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;
}
于 2017-07-08T17:19:29.317 回答