You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 00:15:10