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
相关产品推荐
相关产品推荐

