2013-11-04 57 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()函数,如代码所示。 –

相关问题