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

从标准输入读取文件名后无法打开文件,请求排查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:13:00