你問題的真正答案是你不能。 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
調用這個函數爲openrelative(argv[0], "msg.txt")
。或者從其他地方,但你需要以某種方式使argv[0]
可用。
但是,由於這些方法不能保證能夠正常工作,所以不應該真的使用它們。特別是如果你的程序應該是便攜式的或者被他人使用的話。
'fopen'應該根據正在運行的*環境變量*查找具有相對路徑中指定名稱的文件。如果你堅持使用「可執行文件的路徑」,從'args [0]' – phoeagon 2013-02-20 06:37:48
得到它你的意思是「在當前工作目錄中打開一個文件」,或者你真的是指「在程序所在的目錄中可執行文件駐留「?在示例代碼中使用變量名稱'cwd'似乎暗示前者。 – Dolda2000 2013-02-20 06:38:46
Sry變量的命名是誤導性的。我實際上確實希望它與程序在同一個目錄中。我一直在用包含我想要的文件的目錄初始化一個字符串,但args [0]似乎是我想要的方式。 – 2013-02-20 06:43:21