C语言中如何让跨文件导入的函数固定读取指定目录下的文件
解决方法:让
fun函数始终从pas目录读取pass文件 这问题我之前也碰到过,核心原因是fopen使用相对路径时,是基于进程当前工作目录查找文件的,而不是你的fun.h所在的pas目录。要实现"无论在哪调用fun,都只从pas目录读pass"的需求,最可靠的方式是利用C语言的预定义宏__FILE__来动态定位文件位置。
具体实现步骤
1. 修改/pas/fun.h中的fun函数
我们可以通过__FILE__宏获取当前源文件(也就是fun.h)的完整路径,然后截取目录部分,再拼接pass文件名,这样就能得到pas目录下pass文件的准确路径:
#include <stdio.h> #include <string.h> // 需要用到字符串处理函数 void fun() { FILE *filePointer; char i[20], p[20]; char pass_path[1024]; // 定义足够大的数组存储路径 const char *current_file = __FILE__; // __FILE__会被编译替换为当前文件的完整路径 // 找到路径中最后一个斜杠的位置,截取目录部分 const char *last_slash = strrchr(current_file, '/'); if (last_slash != NULL) { // 复制目录路径到pass_path strncpy(pass_path, current_file, last_slash - current_file + 1); pass_path[last_slash - current_file + 1] = '\0'; // 拼接"pass"文件名 strcat(pass_path, "pass"); } else { // fallback:如果找不到斜杠(极端情况),直接用"pass"(一般不会触发) strcpy(pass_path, "pass"); } // 打开文件并做错误检查(之前的代码缺少这一步,加上更健壮) filePointer = fopen(pass_path, "r"); if (filePointer == NULL) { perror("Failed to open pass file"); return; } fscanf(filePointer, "%s %s", i, p); printf("%s %s\n", i, p); fclose(filePointer); // 用完文件记得关闭,避免资源泄漏 }
2. 原理说明
__FILE__是C语言的预定义宏,编译时会被替换为当前源文件的完整路径(比如./pas/fun.h或者绝对路径)。- 通过
strrchr找到路径中最后一个/的位置,就能截取到pas目录的路径,再拼接pass就得到了pas/pass的准确路径。 - 这个方法的优势是自适应:哪怕你移动了
pas目录的位置,只要fun.h和pass还在同一个目录下,代码不需要任何修改就能正常工作。
额外注意事项
- 如果你是更规范的代码结构(把
fun的实现放在/pas/fun.c,fun.h只放函数声明),同样的逻辑也适用,__FILE__会指向fun.c的路径,效果一样。 - 如果是Windows系统,路径分隔符是
\,可以把代码中的'/'换成'\\',或者同时处理两种分隔符(不过大多数编译器在Windows下也能识别/作为路径分隔符)。 - 始终要检查
fopen的返回值,避免空指针访问导致程序崩溃。
内容的提问来源于stack exchange,提问作者Bhaumik_Tandan
相关产品推荐
相关产品推荐

