C语言程序使用EOF判断文件结尾触发死循环的问题咨询
原程序EOF判断不生效的原因
fgetc函数的返回值类型是int,而非char:该接口设计为返回int的核心目的,就是为了同时容纳正常读取到的字符值(范围0~255)和文件结束标记EOF(C标准定义为值为-1的int型常量)。- 你代码中用来接收返回值的变量
s被定义为char类型,在绝大多数编译器的默认配置中,char为无符号类型,取值范围是0~255:当fgetc读取到文件末尾返回EOF(即int型的-1)时,赋值给无符号char类型的s会发生隐式类型截断,-1会被转换为0xFF(十进制255)。 - 此时值为255的
s和值为-1的EOF做等值判断时,结果永远为假,这就是你看到的编译器警告的含义,也是程序无法跳出循环的直接原因。
补充说明
你使用feof的替代版本虽然能跳出循环,但存在隐藏问题:feof是在读操作失败后才会置位结束标记,最后一次fgetc已经返回EOF,你赋值给s后会先打印一次转换后的255(通常是不可见乱码),再判断feof退出,逻辑并不严谨。
推荐的标准写法
直接将接收fgetc返回值的变量定义为int类型即可,逻辑简洁且无隐患:
#include <stdio.h> int main() { FILE *ptr; int s; ptr = fopen("checkit.txt", "r"); if (ptr == NULL) perror("Cause of error is: "); else { while ((s = fgetc(ptr)) != EOF) { printf("%c", s); } fclose(ptr); } return 0; }
内容的提问来源于stack exchange,提问作者Suraj
相关产品推荐
相关产品推荐

