Mac系统CLion环境下C语言读取文件内容无法打印问题求助
问题分析与解决步骤
结合你的代码问题和Mac+CLion的环境特性,逐一排查如下:
1. 代码语法错误导致异常
你的代码存在两处明显语法问题:
- 多余的闭合大括号:在
while(fgets...)循环结束后多写了两个},直接导致编译失败。如果强行运行旧版本可执行文件,逻辑必然异常,先删掉多余的}确保编译正常。 - 错误输出写法错误:
// 错误写法 printf(stderr, "Cannot open file"); // 正确写法 fprintf(stderr, "Cannot open file\n");printf的第一个参数是格式字符串,你传入stderr会导致非法内存访问,无法正确输出文件打开失败的提示,让你误以为文件正常打开。
2. CLion默认工作目录陷阱
CLion中程序默认运行的工作目录不是源代码所在目录,而是项目根目录下的cmake-build-debug(或cmake-build-release)文件夹。如果你的DB.txt放在源代码目录,程序会找不到文件,但因错误输出失效看不到提示。
解决方法:
- 把
DB.txt复制到CLion的编译输出目录(如cmake-build-debug); - 或修改运行配置:点击顶部菜单栏
Run->Edit Configurations,在Working directory中选择存放DB.txt的目录。
3. 文件内容与编码问题
你提到之前写入文件有乱码,可能引发读取异常:
- 检查
DB.txt是否为空文件,空文件自然无输出; - 若文件是Windows格式(换行符
\r\n),理论上fgets可处理,但如果是UTF-16等非ASCII编码,fgets会将特殊字符视为无效内容,导致读取异常; - 用文本编辑器打开
DB.txt,确认内容正常且编码为UTF-8/ASCII。
4. 验证文件打开状态
修改错误输出后,运行程序若提示Cannot open file,则确认是路径问题;若无提示,可在fopen后加验证代码:
printf("文件已成功打开\n");
确认程序能走到读取逻辑后,再排查内容问题。
修正后的示例代码
#include <stdio.h> #include <string.h> struct nn { char params[10][80]; }; int fileInput(struct nn *record){ FILE *f; f = fopen("DB.txt", "r"); char buffer[80]; // int x = 0; // 后续逻辑需定义x if(f == NULL){ fprintf(stderr, "Cannot open file\n"); return 1; } printf("文件已打开,开始读取内容:\n"); while (fgets(buffer, sizeof(buffer), f) != NULL) { printf("%s", buffer); // 恢复拆分逻辑需取消注释 // int j = 0; // char *token = strtok(buffer, " "); // while(token != NULL){ // strcpy(record[x].params[j], token); // token = strtok(NULL, " "); // j++; // } // x++; } fclose(f); return 0; // 成功执行返回0更符合惯例 }
内容的提问来源于stack exchange,提问作者Dark Dev
相关产品推荐
相关产品推荐

