求助:在C语言中使用通配符查找指定扩展名文件名的示例代码
在C程序中使用通配符匹配并打开.UBX文件
嘿,我懂你的困扰——open()函数本身不支持通配符解析,终端里能直接用*.UBX生效,是因为shell在执行命令前已经帮你把通配符扩展成了实际的文件名。要在C程序里实现这个功能,咱们可以用标准库的glob()函数,它专门用来处理文件名的通配符匹配,刚好适配你“文件夹中仅有一个.UBX文件”的场景。
下面是完整的示例代码,附带详细的错误处理:
#include <glob.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define PATTERN "/home/root/logs/*.UBX" int main() { glob_t globbuf; int fd; // 使用glob函数解析通配符 // GLOB_ERR:遇到错误时立即返回,不继续匹配 int ret = glob(PATTERN, GLOB_ERR, NULL, &globbuf); if (ret != 0) { switch(ret) { case GLOB_NOMATCH: fprintf(stderr, "错误:没有找到匹配的.UBX文件\n"); break; default: fprintf(stderr, "glob函数执行失败,错误码:%d\n", ret); break; } return EXIT_FAILURE; } // 检查匹配结果(根据你的描述应该只有一个文件) if (globbuf.gl_pathc == 0) { fprintf(stderr, "错误:没有找到任何.UBX文件\n"); globfree(&globbuf); return EXIT_FAILURE; } else if (globbuf.gl_pathc > 1) { fprintf(stderr, "警告:找到多个.UBX文件,将使用第一个:%s\n", globbuf.gl_pathv[0]); } // 打开匹配到的第一个文件 fd = open(globbuf.gl_pathv[0], O_RDONLY); if (fd == -1) { perror("open函数执行失败"); globfree(&globbuf); return EXIT_FAILURE; } printf("成功打开文件:%s,文件描述符:%d\n", globbuf.gl_pathv[0], fd); // 这里可以添加你的文件操作逻辑,比如读取内容等 // 关闭文件并释放glob分配的内存 close(fd); globfree(&globbuf); return EXIT_SUCCESS; }
代码说明:
glob()函数会把匹配到的文件名存储在globbuf.gl_pathv数组中,globbuf.gl_pathc是匹配到的文件总数。- 我们覆盖了多种错误场景:没有匹配到文件、glob执行出错、打开文件失败等,避免程序崩溃或出现未知问题。
- 最后一定要调用
globfree()释放资源,防止内存泄漏。
如果你不想用glob(),也可以用scandir()遍历目录,手动筛选.UBX后缀的文件,但glob()更简洁直接,专门适配通配符匹配的需求。
内容的提问来源于stack exchange,提问作者Lightsout
相关产品推荐
相关产品推荐

