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

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;
}

关键改进点说明

  1. 用strrchr替代strchr:确保找到的是文件名最后一个.后的扩展名,兼容文件名含多个.的场景。
  2. 增加stat判断:过滤掉目录、设备文件等非普通文件,避免无效操作。
  3. 跳过.和..:这两个是系统特殊目录,不需要处理。
  4. 检查fopen返回值:如果文件无法打开(比如权限问题),会给出明确提示,不会直接崩溃。
  5. 修正fprintf格式:添加%s占位符匹配字符串类型的sentence,保证内容正确写入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:44:20