如何正确读取文件?这段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
相关产品推荐
相关产品推荐

