C语言fopen()报错为目录,替换puts/fgets为printf/scanf需如何修改?
错误原因
- 你的修改完全没有执行「把文件名拼接到路径末尾」的逻辑,最终传给
fopen的path值仍然是./casestudy/,这本身是个目录,自然会触发fopen报目标是目录的错误。 - 你写的
if(path + len, sizeof(path) - len, bt)是无效逻辑:这是C语言逗号表达式,会依次执行前面的语句、最终返回最后一个表达式的值,bt是非空字符串常量,所以if条件永远为真,但全程没有修改path的内容。
修复方案
如果要实现「用printf提示输入、用scanf读取文件名」的需求,按以下逻辑修改:
- 用
printf输出输入提示 - 定义临时变量存储用户输入的文件名,用
scanf("%s")读取文件名 - 用
strncat把文件名拼接到path的路径后缀之后,同时限制拼接长度避免缓冲区溢出 - 无需再处理换行符,因为
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
相关产品推荐
相关产品推荐

