C:feof 的奇怪行为 [duplicate]

C: strange behavior of feof [duplicate]

提问人:zesy 提问时间:12/26/2017 更新时间:12/26/2017 访问量:125

问:

我是 C 的新手。我偶然发现了某些我无法解释的行为。具体来说,在下面的代码中,我创建了一个文件,在其中写入一个字节的信息,然后关闭并再次打开它,读取信息(我的 1 个字节)直到到达,然后逐个字节移动文件指针的当前位置(即根本不更改当前位置),突然我不再在了。怎么会这样?feofEOF0EOF

#include <stdio.h>
#include <stdint.h>
typedef uint8_t BYTE;

int main(void) {
    FILE* f = fopen("myfile.txt","w");
    BYTE b = 0x0000;
    fwrite(&b,1,1,f);
    fclose(f);
    f = fopen("myfile.txt","r");
    while (!feof(f)){
        fread(&b,1,1,f);
    }
    printf("We have reached EOF: %i \n",feof(f));
    fseek(f,0,SEEK_CUR);
    printf("We have reached EOF: %i \n",feof(f));
} 

输出

We have reached EOF: 1 
We have reached EOF: 0 
C Fseek Feof

评论

0赞 wildplasser 12/26/2017
stackoverflow.com/q/5431941/905902
0赞 zesy 12/26/2017
@wildplasser你提到的问题似乎在谈论我的问题,但那里的讨论/答案对我来说太高级了。
2赞 Quentin 12/26/2017
呃,伙计们?你不是用那个跳枪吗?这里非常合适......while(!feof())
0赞 wildplasser 12/26/2017
@Quentin:问题确实不同,feof() 可以在这里使用。但 IMO 它要么是一种过于复杂的方法,要么是一种学习练习,在这种情况下,其他答案可能会有所帮助。

答:

3赞 Nick 12/26/2017 #1

fseek 文档:

成功调用此函数后,将清除流的文件末尾内部指示符,并且之前调用此流的 ungetc 的所有影响都将被删除。

评论

0赞 zesy 12/27/2017
难道你不知道fseek这种不直观行为的动机是什么吗?
0赞 Nick 12/27/2017
不,但这听起来是一个很好的 SO 问题。