从标准输入读取文件名后无法打开文件,请求排查C代码错误
排查文件无法打开的问题
嘿,我来帮你揪出代码里的问题!你的代码有两个关键错误导致文件找不到,咱们一个个拆解:
第一个核心问题:
fgets读取的文件名包含换行符
当你从键盘输入文件名并按下回车时,fgets会把这个换行符(\n)也一起存入filename数组。比如你输入ROMAN_in.txt,实际数组里存的是ROMAN_in.txt\n,这时候fopen会尝试打开带换行符的文件名,系统自然找不到对应的文件。
解决方法:读取完文件名后,手动去掉末尾的换行符,用strcspn函数最方便:filename[strcspn(filename, "\n")] = '\0';这个函数会定位到第一个
\n的位置,直接把它替换成字符串结束符\0,文件名就完全正确了。第二个问题:循环中
fgets的长度参数错误
你在while循环里写的是fgets(buffer, strlen(buffer), file),但buffer是未初始化的字符数组,strlen(buffer)的结果是随机的(它会一直找\0直到内存里的未知位置),这会导致读取文件内容时出现不可预料的错误。
正确的做法是用sizeof(buffer),因为buffer是固定大小的数组,sizeof能直接获取它的总长度:while (fgets(buffer, sizeof(buffer), file) != NULL)
修正后的完整代码
#include <stdio.h> #include <string.h> int main() { FILE *file; char filename[200]; char buffer[1000]; if (fgets(filename, sizeof(filename), stdin) == NULL) { printf("Error reading filename\n"); return 1; } // 移除文件名末尾的换行符 filename[strcspn(filename, "\n")] = '\0'; file = fopen(filename, "r"); if (file == NULL) { fprintf(stderr, "File %s not found\n", filename); return 1; } else { while (fgets(buffer, sizeof(buffer), file) != NULL) { printf("%s", buffer); } fclose(file); // 别忘了用完文件后关闭它哦 } return 0; }
内容的提问来源于stack exchange,提问作者pteran
相关产品推荐
相关产品推荐

