在当前目录中打开文件

时间:2013-11-04 03:11:17

标签: c++ file directory

我正在尝试加载文件,之前我使用的是硬编码文件位置,(例如“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:\ folder ...

有人能指出我是怎么做到的吗?

2 个答案:

答案 0 :(得分:4)

大多数系统的搜索路径从当前工作目录开始,然后到PATH环境变量。因此,您需要做的就是指定没有绝对路径标记的文件/文件夹,它将使用相对于工作目录的路径:

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

答案 1 :(得分:3)

\开头的路径始终相对于当前驱动器的根目录。如果当前广告系列为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