#define EOF (-1)
迄今为止,关于 EOF 作用的观点各异。大多数程序员认为“文件中有一个 EOF 字符,用于表示文件的结尾”。但实际上,这个观点并不正确(或者说并不完整),在文件所包含的数据中,并没有什么文件结束符。从 EOF 宏的定义中可以看出,EOF 宏的值为 -1,属于 int 类型的数据,在 32 位系统中,可以表示为 0xFFFFFFFF。由此可见,EOF 并不是一个字符,也不是文件中实际存在的内容。那么,为什么会有这样的观点存在呢?int main(void) { FILE *fp=NULL; int c; fp=fopen("myfile.txt","r"); if(fp == NULL) { printf("不能够访问该文件.\n"); exit(1); } while((c=fgetc(fp)) != EOF) { printf("%x\n", c); } fclose(fp); fp=NULL; }对于 fgetc(或者 getc)函数,它返回一个 int 类型的数据。在正常情况下,fgetc(或者 getc)函数以 unsigned char 的方式读取文件流,并扩张为一个整数返回。换言之,fgetc(或 getc)函数从文件流中读取一个字节,并加上 24 个 0,成为一个小于 256 的整数,然后返回。
char c; fp=fopen("myfile.txt","r"); if(fp == NULL) { printf("不能够访问该文件.\n"); exit(1); } while((c=fgetc(fp)) != EOF) { printf("%x\n", c); }因为文本文件中存储的是 ASCII 码,而 ASCII 码中 FF 代表空值(blank),所以如果读文件返回了 0xFF,也就说明已经到了文本文件的结尾处。也就是说,在语句“while((c=fgetc(fp))!=EOF)”中,当读取的字符为 0xFF 时,子语句“c=fgetc(fp)”中的“fgetc(fp)”的值由 0x000000FF 转换为 char 类型(即 c 等于 0xFF);而在执行子语句“c!=EOF”时,字符与整数比较,c 被转换为 0xFFFFFFFF,条件成立,遇到空格字符时就退出。由此可见,如果是二进制文件,其中可能会包含许多 0xFF,因此不能把读到 EOF 作为文件结束的条件,而此时只能使用 feof() 函数。
unsigned char c; fp=fopen("myfile.txt","r"); if(fp == NULL) { printf("不能够访问该文件.\n"); exit(1); } while((c=fgetc(fp))!= EOF) { printf("%x\n", c); }在上面的“while((c=fgetc(fp))!=EOF)”语句中,就算是语句“fgetc(fp)”返回的结果为 -1(即 0xFFFFFFFF),但通过语句“c=fgetc(fp)”对其强制转换 unsigned char 类型,即 c 等于 0xFF。而在执行子语句“c!=EOF”时,c 被转换成 0x000000FF,永远也不可能等于 0xFFFFFFFF,因此表达式“c!=EOF”将永远成立。
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有