为什么我无法使用fseek()访问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定位'文件位置指示符'。
但是这段代码的结果是“000”。 这是为什么发生?为什么我无法使用fseek()访问EOF?

+2

你必须从文件中读取以获得EOF。 –

+0

** 7.21.9.2 fseek函数p5 **清除 流的文件结束指示符,然后建立新的位置._ – BLUEPIXY

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

您可以寻找超出当前EOF的文件开放写入(或开放阅读和写入)。

有关为什么你很少需要使用feof()的更多信息请参阅while (!feof(file)) is always wrong。在某些方面,feof()是一个你应该忘记的功能 - 如果你认为它不存在,你的大部分程序都会改进。

This documentation on feof是很清楚的(重点煤矿):

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

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