C语言开发向特定扩展名文件追加内容工具的问题求助
问题分析与修复方案
嘿,我看了你写的C语言工具代码,目标是给指定扩展名的文件追加内容对吧?这里面有几个关键问题导致它没法正常跑,我帮你拆解一下并给出修复后的版本:
代码里的核心问题
- 错误修改只读的
dir->d_name:dir->d_name是readdir返回的目录项名称,属于只读内存区域,直接用strcat会触发未定义行为。而且你的逻辑搞反了——应该是判断文件扩展名是否为.lua,不是给文件名强行加.lua后缀。 - 文件指针定义与打开时机错误:你注释里的
const char entry_file = fopen(...)类型完全错误,fopen返回的是FILE*类型;而且应该在确认是.lua文件后再打开它,不是提前操作。 fprintf格式字符串错误:fprintf(entry_file, "filename = ", sentence)缺少格式占位符,根本没法正确写入sentence的内容,得加上对应类型的占位符(比如字符串用%s)。- 未区分文件与目录:
readdir会返回当前目录(.)、父目录(..)以及子目录,你得判断当前条目是不是普通文件,不然会尝试打开目录导致错误。 - 未处理无扩展名的文件:如果文件没有扩展名,
strchr(dir->d_name, '.')会返回NULL,直接访问会触发错误,得先检查ext是否有效。
修复后的完整代码
#include <stdio.h> #include <dirent.h> #include <string.h> #include <sys/stat.h> // 假设这是你要追加的内容,可根据实际需求修改 const char* sentence = "your content here"; int main() { // 这里示例打开当前目录,可替换为你需要遍历的目录路径 DIR* d = opendir("."); if (d) { struct dirent* dir; while ((dir = readdir(d)) != NULL) { // 跳过当前目录和父目录的特殊条目 if (strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0) { continue; } // 获取文件状态,判断是否为普通文件 struct stat file_stat; if (stat(dir->d_name, &file_stat) != 0 || !S_ISREG(file_stat.st_mode)) { continue; // 非普通文件,直接跳过 } // 用strrchr找最后一个.,处理文件名含多个.的情况(比如test.v1.lua) char* ext = strrchr(dir->d_name, '.'); if (ext != NULL && strcmp(ext, ".lua") == 0) { // 以追加模式打开文件 FILE* entry_file = fopen(dir->d_name, "a"); if (entry_file != NULL) { // 正确写入内容,注意格式占位符匹配 fprintf(entry_file, "filename = %s\n", sentence); fclose(entry_file); printf("已处理文件: %s\n", dir->d_name); } else { printf("无法打开文件: %s(权限不足或文件不存在)\n", dir->d_name); } } } closedir(d); } else { printf("无法打开指定目录\n"); } return 0; }
关键改进点说明
- 用
strrchr替代strchr:确保找到的是文件名最后一个.后的扩展名,兼容文件名含多个.的场景。 - 增加
stat判断:过滤掉目录、设备文件等非普通文件,避免无效操作。 - 跳过
.和..:这两个是系统特殊目录,不需要处理。 - 检查
fopen返回值:如果文件无法打开(比如权限问题),会给出明确提示,不会直接崩溃。 - 修正
fprintf格式:添加%s占位符匹配字符串类型的sentence,保证内容正确写入。
内容的提问来源于stack exchange,提问作者Halo345
相关产品推荐
相关产品推荐

