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

C语言fopen()报错为目录,替换puts/fgets为printf/scanf需如何修改?

错误原因

  • 你的修改完全没有执行「把文件名拼接到路径末尾」的逻辑,最终传给fopen的path值仍然是./casestudy/,这本身是个目录,自然会触发fopen报目标是目录的错误。
  • 你写的if(path + len, sizeof(path) - len, bt)是无效逻辑:这是C语言逗号表达式,会依次执行前面的语句、最终返回最后一个表达式的值,bt是非空字符串常量,所以if条件永远为真,但全程没有修改path的内容。

修复方案

如果要实现「用printf提示输入、用scanf读取文件名」的需求,按以下逻辑修改:

  1. 用printf输出输入提示
  2. 定义临时变量存储用户输入的文件名,用scanf("%s")读取文件名
  3. 用strncat把文件名拼接到path的路径后缀之后,同时限制拼接长度避免缓冲区溢出
  4. 无需再处理换行符,因为scanf("%s")默认会跳过空白字符(包括换行符),不会把换行符存入结果。

修复后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char path[256] = "./casestudy/";
    size_t len = strlen(path);
    char filename[128]; // 存储输入的文件名

    // 替换原来的puts为printf提示
    printf("Enter a file name:\n");
    // 替换原来的fgets为scanf读取文件名,限制长度避免溢出
    if (scanf("%127s", filename) == 1)
    {
        // 把文件名拼接到path末尾,预留结束符位置
        strncat(path, filename, sizeof(path) - len - 1);
    }
    else
    {
        printf("输入文件名失败\n");
        exit(EXIT_FAILURE);
    }

    FILE *file = fopen(path, "w");
    if (file == NULL)
    {
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    // 业务逻辑写在这里
    fclose(file);
    return 0;
}

如果不需要用户输入、固定使用dd.txt作为文件名,直接删除scanf相关逻辑,直接调用strncat(path, "dd.txt", sizeof(path) - len -1);拼接即可。

内容的提问来源于stack exchange,提问作者techie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:39:04