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

如何正确读取文件?这段C语言代码为何陷入无限循环?

代码问题分析与正确读取实现

原代码的核心问题

  • 循环条件类型不匹配:"\n"是字符串常量(本质是char*指针),而ch是字符类型,你这里是在比较一个字符和指针的内存地址,两者永远不可能相等,所以循环会无限执行。正确的换行符应该用单引号包裹的'\n'(字符常量)。
  • 变量类型错误:fgetc()的返回值是int类型——它会返回读取到的字符(转成unsigned char再转int),或者返回EOF(值为-1)表示文件结束或读取错误。如果把ch定义成char,当系统中char是无符号类型时,EOF会被转换成255,此时判断ch != EOF也会失效。

就算你把条件改成ch != '\n',还是有问题:当文件读完(到EOF)但没遇到换行时,循环也会无限执行,因为此时ch是EOF,不等于'\n'。

正确读取文件的实现方式

场景1:读取到换行符停止(包含换行符)

#include <stdio.h>

int main() {
    FILE *file = fopen("your_file.txt", "r");
    if (file == NULL) { // 必须先判断文件是否打开成功
        perror("Failed to open file");
        return 1;
    }

    int ch; // 必须用int类型存fgetc的返回值
    do {
        ch = fgetc(file);
        if (ch != EOF) { // 输出前先判断不是EOF,避免输出乱码
            printf("%c", ch);
        }
    } while (ch != EOF && ch != '\n'); // 同时判断EOF和换行符

    fclose(file);
    return 0;
}

场景2:读取整个文件直到EOF

#include <stdio.h>

int main() {
    FILE *file = fopen("your_file.txt", "r");
    if (file == NULL) {
        perror("Failed to open file");
        return 1;
    }

    int ch;
    while ((ch = fgetc(file)) != EOF) { // 更简洁的写法,先读再判断
        printf("%c", ch);
    }

    fclose(file);
    return 0;
}

额外注意点

  • 打开文件后必须检查是否成功,如果文件不存在、权限不足等情况,fopen会返回NULL,直接操作会导致崩溃。
  • fgetc读取到文件末尾或出错时都会返回EOF,如果需要区分是哪种情况,可以用feof()和ferror()函数判断。

内容的提问来源于stack exchange,提问作者user20825401

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:55:12