2013-11-04 180 views
0

我想加載文件,以前我使用的是硬編碼的文件位置(如「c:\ location \ file.txt」),但現在有幾個朋友也在使用文件,我想讓他們把可執行文件放在任何他們想要的地方。在當前目錄中打開文件

我當前的代碼看起來像:

ifstream myfile; 
myfile.open("c:\\client\\settings.cfg"); 

我試圖讓用戶將他們的可執行文件到任何他們想要的文件夾中更改它,然後他們創建一個文件夾,並把自己的設置文件進去和exe將加載與他們的設置。

ifstream myfile; 
myfile.open("\\settings\\settings.cfg"); 

我有一些基本的錯誤處理到位,現在程序總是出錯,說它找不到文件。

文件結構如下所示:

[ART] 
    asset.png 
[SETTINGS] 
    settings.cfg 
client.exe 

這似乎是一個很簡單的事情,但我找不到任何辦法做到這一點。關於讀取和寫入文件的每個示例和教程僅處理可執行文件目錄中的文件,或硬編碼到c:\文件夾中...

任何人都可以指出我如何做到這一點?

回答

4

大多數系統的搜索路徑從當前工作目錄開始,然後到PATH環境變量。所以,你需要做的是指定的文件/文件夾沒有絕對路徑標記和它的路徑相對會使用到工作目錄:

ifstream myfile; 
myfile.open("settings\\settings.cfg"); 
//   ^^ Note the lack of \\ to start the file path 
+0

This Works!謝謝! – user2827019

+2

@ user2827019正如我在我的回答中所提到的,這與可執行文件的目錄無關。它只相對於用戶的當前目錄。如果用戶從其目錄中啓動可執行文件,它只會匹配可執行文件的目錄。 –

+0

@ user2827019:沒問題。需要注意的一點是它基於*工作目錄*,而不是可執行目錄。因此,如果他們創建快捷方式並更改工作目錄(Windows快捷方式的「開始」文件夾),它將嘗試查看。 –

2

\開頭的路徑總是相對於當前驅動器的根目錄。如果當前驅動器是C:,則\settings\settings.cfg表示C:\settings\settings.cfg

請注意,您可以使用/以避免所有內容的泄漏。所以你可以使用:settings/settings.cfg。這將相對於用戶的當前目錄。但請注意,這不一定對應於可執行文件所在的目錄。如果你需要可執行文件的目錄,那麼你需要使用Windows API函數來得到它:

#include <Windows.h> 
// ... 

HMODULE module = GetModuleHandleW(NULL); 
WCHAR path[MAX_PATH]; 
GetModuleFileNameW(module, path, MAX_PATH); 

現在,如果你想打開settings/settings.cfg相對於可執行文件的目錄下,創建與開始的路徑path並附加/settings/settings.cfg

+0

所以沒有辦法做到這一點?我總是必須指定一切的確切位置?如果我將代碼更改爲'\ settings \ settings.cfg',即使它們「安裝到」c:\ game或c:\ client中,它總是會將該文件放入並讀取到C:/settings/settings.cfg中的文件。 – user2827019

+0

@ user2827019使用GetModuleFileNameW()函數,如代碼所示。 –

相關問題