2012-12-11 42 views
3

我嘗試做以下的完整路徑:的fopen文件,而無需使用

FILE *fileNAME = fopen("file.txt", "r"); 

它工作時,我有:

FILE *fileNAME = fopen("users/username/desktop/folder/file.txt", "r"); 

但我想在我的家用計算機之外使用此文件的路徑應該是相對的,特別是對於無法訪問實際源代碼的最終用戶。我的問題是,如何真正做到這一點,如果問題是由於編譯器默認不使用正確的目錄導致的,我該如何改變它? (我用XCODE)

+5

這些都不是絕對路徑。 – netcoder

+0

隨時編輯技術問題,但問題仍然存在......你能幫我一下嗎? – user1883003

+0

@ user1883003這甚至不是一個正確的問題,我們無法編輯'技術性'(真的,真的,你在這裏求助,這是你的工作),沒有適當的信息。你在用什麼xcode?這甚至與你的問題有什麼關係?你在用什麼庫?開源跨平臺C命令行工具?請提供信息。 –

回答

2

當您通過命令

$myprogram users/username/desktop/folder/file.txt 

,並在你的代碼源調用你的程序,你可以從argv的得到這個路徑可以傳遞作爲輸入參數的文件路徑

int main (int argc, char **argv) 
{ 
    char *file_path = argv[1]; 
    .... 
} 

argc是argv數組的長度。所以如果數組長度大於2小於你的程序應該返回的幫助消息,指示用戶輸入文件路徑作爲參數

int main (int argc, char **argv) 
{ 
    char *file_path; 
    if (argc <2) { 
     printf("Usage: %s <file path>\n", argv[0]); 
     exit(1); 
    } 
    file_path = argv[1]; 
    .... 
} 
+0

感謝您的輸入! – user1883003

+0

不用客氣 – MOHAMED

+0

你應該在使用argv [1]之前檢查argc,以防萬一... – Joze

1

如果您使用的是Mac OS X(Xcode中,右,我不?OS X用戶,但我認爲這是它),你可以得到當前的可執行文件路徑(而不是當前工作目錄路徑)與

char path[1024]; 
uint32_t size = sizeof(path); 
if (_NSGetExecutablePath(path, &size) == 0) 
    printf("executable path is %s\n", path); 
else 
    printf("buffer too small; need size %u\n", size); 

在此之後,你有兩種方式:

1)無論是更新結合文件路徑與exe目錄(如sprintf(filepath, "%s/%s", path, "file.txt");

2)使用chdir函數和相對路徑訪問文件更改當前目錄。

編輯:_NSGetExecutablePath返回可執行文件路徑,而不是可執行文件的目錄,所以使用substr/strrchr來提取最後發生'/'字符之前的路徑。

+0

謝謝您的詳細解答!我試過了,我收到一個非常長的路徑名:/ users/username/library/developer/xcode/deriveddata/filename-laksdjlakdsjl(actual gibberish)/ build/products/debug/filename – user1883003

+0

這就是你的程序所在的位置試着在Finder中找到這個目錄)。將程序移動到桌面,並從終端啓動它,它應該指向您的桌面文件夾。 –

+0

其實它是你的工作空間。您可以在Product-> Scheme-> edit Scheme下編輯您的當前目錄 –