我正在编写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]或者提升。我想使用相对路径的原因是因为我试图创建一个对大多数操作系统来说都很常见的应用程序并且使用相对路径可以帮助我跳过确定操作系统的问题。那么请你告诉我怎么做?
答案 0 :(得分:1)
目标环境中通常没有anything.cpp
(除非您明确地将其放在那里,但事实仍然是,它不是正在运行的源文件) ,你所拥有的只是可执行文件。
有一些方法可以获取可执行文件的路径,如果它位于bin
子目录中,您仍然可以从中获得相对性。但这通常是多用户环境中的坏想法,因为它们通常在一个位置共享可执行文件。
这就是为什么Windows如此努力地为我们提供c:\users
和UNIX $HOME
(以及bin/var/etc
区域以便于软件控制)的原因。
您拥有的代码将相对于您的当前目录起作用,只要设置正确,该目录就能正常工作。所以,如果你有:
toplevel
|
+--- bin
|
+--- files
并且您在bin
中运行,您将获得正确的文件。但是,我仍然认为它不一定是个好主意。
还有很多其他方法可以做到这一点,例如在命令行或环境变量中提供完整路径。但是,如果您想要全自动目录选择,它必须来自您可以获得的信息,例如当前目录,用户的主目录,可执行路径等。
如果您可以保证目标环境中的位置不会改变,那么还有一些方法可以在源代码时间(编译期间)获取路径。
尝试的第一步是使用__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.c
类似于$<
规则中的makefile
。
然后您可以使用以下代码:
#include <iostream>
int main (void) {
std::cout << ((SRCDIR2[0] != '/') ? SRCDIR1 : SRCDIR2) << '\n';
return 0;
}
选择正确的目录(绝对或相对变成绝对目录)。