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

UTM虚拟机Linux终端下C文件打印程序无限输出问号问题

问题分析与修复

你的程序在Linux下出现无限输出问号的问题,核心是两个代码缺陷:

1. 未检查文件打开是否成功

fopen在文件不存在、路径错误或无读取权限时会返回NULL。你的代码直接使用这个NULL指针调用fgetc,属于未定义行为。Linux下这种操作会返回一个无效的字符值(通常对应终端显示的问号),且不会触发EOF,导致循环无限执行。

Mac系统对该未定义行为的处理恰好没暴露问题,但这不代表代码是正确的。

2. char类型无法正确存储EOF

fgetc的返回值是int类型:成功读取字符时返回其ASCII值(非负),遇到文件结束或错误时返回EOF(一个负整数,通常是-1)。如果用char存储返回值,当系统默认char为无符号类型时,EOF会被转换成一个正整数,永远无法满足ch != EOF的退出条件,直接导致无限循环。Linux下多数编译器默认char是无符号的,这就是问题触发的直接原因。


修正后的代码

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if (argc != 2) {
        printf("Too many/no arguments!\n");
        exit(1);
    }

    FILE *fdin = fopen(argv[1], "r");
    // 检查文件是否成功打开
    if (fdin == NULL) {
        perror("Failed to open file");
        exit(1);
    }

    // 用int存储fgetc的返回值
    int ch = fgetc(fdin);
    while (ch != EOF) {
        printf("%c", ch);
        ch = fgetc(fdin);
    }

    fclose(fdin);
    return 0;
}

额外说明

  • perror会自动输出系统级的错误原因(比如"Permission denied"或"No such file or directory"),比自定义提示更实用。
  • 运行程序时要确保传入正确的文件路径,比如./your_program input.txt,且当前目录下确实存在该文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:00:04