C++:使用相对路径将内容写入文件

C++: Write content to file using relative path

我正在编写 C++ 程序,代码组织如下

main.cpp
source/newfile.cpp
header/newfile.h
files/file.txt

main.cpp 呼叫 newfile.cpp。从 newfile.cpp 我想导航到 files/file.txt 并在那里写一些内容。我的代码看起来像这样..

#include <iostream>
#include <fstream>

using namespace std;

class abc {

    void function () {
         ofstream file ("../files/file.txt");
         file << "I want to write here " << endl;
         file.close ();

    }

}

我不想使用 argv[0] 或 boost。我想使用相对路径的原因是因为我正在尝试创建一个对大多数 OSes 通用的应用程序,使用相对路径可以帮助我跳过确定 OS 的问题。那么你能告诉我怎么做吗?

target环境中一般没有anything.cpp(除非你明确地把它放在那里但事实是,它不是source 文件即 运行),你所拥有的只是可执行文件。

有一些方法可以获取可执行文件的路径,因此,如果它位于 bin 子目录中,您仍然可以从该目录中获取相对路径。但这在多用户环境中通常是一个 糟糕的 想法,因为他们通常在一个位置共享可执行文件。

这就是为什么 Windows 如此努力地为我们提供 c:\users 之类的东西,而 UNIX 有 $HOME(以及 bin/var/etc 领域以简化软件控制)。

您拥有的代码将相对于您的 当前 目录工作,如果设置正确,该目录将工作良好。所以,如果你有:

toplevel
|
+--- bin
|
+--- files

并且您在 bin 中 运行,您将获得正确的文件。但是,我仍然认为这不一定是个好主意。

还有很多其他方法可以做到这一点,例如在命令行或环境变量中提供完整路径。但是,如果你想要全自动目录selection,它必须来自你可以获得的信息,例如当前目录、用户的主目录、可执行文件路径等等上。


如果你能保证在目标环境中位置不会改变,也有在源代码时(编译期间)获取路径的方法。

尝试的第一步是使用 __FILE__ 宏,它会为您提供假定的源文件名。如果它包含路径(非强制),您可以使用它来计算它所在的目录。如果它包含类似以下内容的路径,您可以 test

#include <iostream>
int main (void) {
    std::cout << __FILE__ << '\n';
    return 0;
}

如果您使用该方法获得完整路径,没有什么能阻止您自己提供它,例如将您的编译命令更改为:

gcc -DSRCDIR1=\"$(dirname $PWD/qq.c)\" -DSRCDIR2=\"$(dirname qq.c)\" -o qq qq.c

(尽管 qq.cmakefile 规则中类似于 $<)。

然后您可以使用如下代码:

#include <iostream>
int main (void) {
    std::cout << ((SRCDIR2[0] != '/') ? SRCDIR1 : SRCDIR2) << '\n';
    return 0;
}

到select正确的目录(绝对或相对转绝对)。