2013-02-20 22 views
1

大家好我想從我爲我的網絡編程類寫的服務器程序打開一個文件發送到我的客戶端程序。我曾嘗試使用fopen,如何打開與程序位於同一目錄的c文件?

strcat(cwd, msg);    //i append the directory to the filename 
    printf("%s\n", cwd); 

    if(n>0){ 
    req = fopen(msg, "r");  //fopen(~\\blah\\blah\\blah\\msg) 

msg是一個txt文件的名稱。

我想這樣做在c。

任何想法?不勝感激。

想補充一點,即使打印的目錄是正確的,req仍然是空的。

+0

'fopen'應該根據正在運行的*環境變量*查找具有相對路徑中指定名稱的文件。如果你堅持使用「可執行文件的路徑」,從'args [0]' – phoeagon 2013-02-20 06:37:48

+0

得到它你的意思是「在當前工作目錄中打開一個文件」,或者你真的是指「在程序所在的目錄中可執行文件駐留「?在示例代碼中使用變量名稱'cwd'似乎暗示前者。 – Dolda2000 2013-02-20 06:38:46

+0

Sry變量的命名是誤導性的。我實際上確實希望它與程序在同一個目錄中。我一直在用包含我想要的文件的目錄初始化一個字符串,但args [0]似乎是我想要的方式。 – 2013-02-20 06:43:21

回答

1

你問題的真正答案是你不能。 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]可用。

但是,由於這些方法不能保證能夠正常工作,所以不應該真的使用它們。特別是如果你的程序應該是便攜式的或者被他人使用的話。

+0

在Windows上,argv [0]與我用過的所有C/C++編譯器的exe路徑相同。 – 2013-02-20 09:12:14

0

從你的代碼中的註釋:

// fopen(~\\blah\\blah\\blah\\msg) 

變量cwd可能~。如果是這樣,那麼FatalError提到,fopen()不會爲您擴展它。只有shell在我使用的系統上執行此操作。

解決方法是例如致電getenv("HOME"),然後自行展開~

相關問題