一、原型
1. 在头文件stdio.h中有如下宏定义(gcc):
#define feof(__F) ((__F)->_flag & _IOEOF)
#define _IOEOF 0x0010 /* EOF reached on read */
2. 原型声明:
_CRTIMP int __cdecl__MINGW_NOTHROW feof (FILE*);
3.FILE结构体定义:
typedef struct _iobuf
{
char* _ptr;
int _cnt;
char* _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
} FILE;
二、分析
函数feof()的关键代码为:return( pFile->_flag & 00010000 )。此处不关注宏定义。
函数feof()的实现,最重要的变量是FILE结构体中的_flag成员。
二进制文件没有所谓的文件结束标志,读取时,当文件指针指向文件尾时(由操作系统判定),_flag的第4位会被置1,feof()返回非零值。究竟是由谁在执行这个置位操作,目前作者没有探究出来。
文本格式的文件是否有文件结束标志,未曾探究。