为什么我不能使用fseek()访问EOF?

时间:2016-10-18 18:09:14

标签: c file eof

#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定位文件位置指示器&#39;在文件的末尾。
但是这段代码的结果是&#34; 000&#34;。 为什么会这样?

2 个答案:

答案 0 :(得分:3)

在您尝试读取某些数据并且没有要读取的数据之前,feof()函数不会报告它处于EOF状态。

您可以在文件的当前EOF之外寻找可以写作的文件(或者可以阅读和写作的文件)。

有关您很少需要使用feof()的原因的详细信息,请参阅while (!feof(file)) is always wrong。在某些方面,feof()是您应该忘记的功能 - 如果您认为它不存在,您的大多数程序都会得到改善。

答案 1 :(得分:2)

This documentation on feof非常明确(强调我的):

  

此功能仅报告最多报告的流状态   最近的I / O操作,它不检查相关的数据源。   例如,如果最近的I / O是fgetc,则返回   文件的最后一个字节,feof返回零。 下一个fgetc失败了   将流状态更改为文件结尾。只有这样feof才会返回   非零的。

     

在典型用法中,输入流处理会因任何错误而停止; feof和   然后使用ferror来区分不同的错误   条件。