【问题标题】:Does fread move the file pointer?fread 会移动文件指针吗?
【发布时间】:2012-05-28 15:18:37
【问题描述】:

简单的问题,

当我使用 fread 时:

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

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

【问题讨论】:

    标签: c file fread


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

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

      【讨论】:

      • 啊,谢谢你的回复。我想知道什么必须使用 fseek 来重新定位文件指针。
      • 这个答案实际上并没有解决被问到的问题,这只是调用 fread 后文件指针会发生什么
      • 好吧,在你的回答中也包含一个解释也没有什么坏处。
      • 你的答案应该以“是”开头来回答标题中的问题。
      • 我颠倒了顺序,以反映在 cmets 中表达的想法。答案实际上是最后的小“编辑”部分。我希望这种变化能改善读者在寻找答案时的体验。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        是的,确实如此。可以使用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;
        }
        

        【讨论】:

          猜你喜欢
          • 2012-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多