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.c
在 makefile
规则中类似于 $<
)。
然后您可以使用如下代码:
#include <iostream>
int main (void) {
std::cout << ((SRCDIR2[0] != '/') ? SRCDIR1 : SRCDIR2) << '\n';
return 0;
}
到select正确的目录(绝对或相对转绝对)。
我正在编写 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.c
在 makefile
规则中类似于 $<
)。
然后您可以使用如下代码:
#include <iostream>
int main (void) {
std::cout << ((SRCDIR2[0] != '/') ? SRCDIR1 : SRCDIR2) << '\n';
return 0;
}
到select正确的目录(绝对或相对转绝对)。