你的问题的真正答案是你不能。C 无法让您知道构建程序映像的文件所在的位置,部分原因是它没有假设它甚至是从文件构建的。因此,没有通用的、可移植的方式可以保证工作。
但是,在某些环境和某些条件下,您可以使用argv[0]
,它可能包含找到程序文件的路径。在 Unix/Linux 下经常出现这种情况(但不一定——你要感谢启动你的程序的程序)。我不知道它在 Windows 等其他系统上的情况如何。
如果您想使用该方法,可以执行以下操作:
FILE *openrelative(char *base, char *name)
{
char *buf1, *dir, *buf2;
int len;
FILE *ret;
buf1 = strdup(base); /* dirname might modify its argument, so copy base. */
dir = dirname(buf1);
len = strlen(dir) + 1 + strlen(name) + 1;
buf2 = malloc(len);
snprintf(buf2, len, "%s/%s", dir, name);
ret = fopen(buf2, "r");
free(buf2); free(buf1);
return(ret);
}
main
然后,从as调用此函数openrelative(argv[0], "msg.txt")
。或者从其他地方,但你需要以argv[0]
某种方式提供。
但是,由于不能保证这些方法有效,因此您不应该真正使用它们。如果您的程序应该是可移植的或被其他人使用,则尤其如此。