【问题标题】:Why can't I access EOF using fseek()? [duplicate]为什么我不能使用 fseek() 访问 EOF? [复制]
【发布时间】:2017-02-28 03:15:24
【问题描述】:
#include <stdio.h>

int main()
{
    FILE * fp = fopen("Introduce.txt","rt");

    fseek(fp,0,SEEK_END);
    int i = feof(fp);
    printf("%d",i);

    fseek(fp,1,SEEK_END);
    i = feof(fp);
    printf("%d",i);

    fseek(fp,-1,SEEK_END);
    i = feof(fp);
    printf("%d",i);

    return 0;
}

我试图访问文件末尾的 EOF 定位“文件位置指示器”。
但是这段代码的结果是“000”。 为什么会这样?

【问题讨论】:

  • 你必须从文件中读取才能获得 EOF。
  • 7.21.9.2 fseek 函数 p5 清除流的文件结束指示符,然后建立新位置。跨度>

标签: c file eof


【解决方案1】:

feof() 函数不会报告它处于 EOF,直到您尝试读取一些数据并且没有要读取的数据。

您可以在打开以供写入(或打开以供读取和写入)的文件的当前 EOF 之外进行查找。

请参阅while (!feof(file)) is always wrong 了解更多信息,了解为什么您很少需要使用feof()。在某些方面,feof() 是一个你应该忘记的函数——如果你假设它不存在,你的大多数程序都会得到改进。

【讨论】:

    【解决方案2】:

    This documentation on feof 很清楚(强调我的):

    这个函数只报告大多数人报告的流状态 最近的 I/O 操作,它不会检查关联的数据源。 例如,如果最近的 I/O 是 fgetc,它返回 文件的最后一个字节,feof 返回零。 下一个fgetc 失败并且 将流状态更改为文件结尾。只有feof 返回 非零。

    在典型用法中,输入流处理会在任何错误时停止; feofferror 然后用于区分不同的错误 条件。

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 2016-01-19
      • 2018-09-04
      • 1970-01-01
      • 2019-05-04
      • 2014-12-15
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多