【问题标题】:C++: Write content to file using relative pathC++:使用相对路径将内容写入文件
【发布时间】:2015-03-10 22:20:51
【问题描述】:

我正在编写 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。我想使用相对路径的原因是因为我正在尝试创建一个对大多数操作系统都通用的应用程序,并且使用相对路径可以帮助我跳过确定操作系统的问题。那你能告诉我怎么做吗?

【问题讨论】:

标签: c++ file relative-path


【解决方案1】:

target 环境中通常没有anything.cpp(除非你明确地把它放在那里但事实仍然存在,它不是在运行的 source 文件),所有你有的是可执行文件。

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

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

您拥有的代码将相对于您的 当前 目录运行,只要设置正确,它将运行良好。所以,如果你有:

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

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

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


如果能保证在目标环境中位置不会发生变化,也有办法在源时(编译时)获取路径。

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

#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 规则中类似于$&lt;)。

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

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

选择正确的目录(绝对或相对变成绝对)。

【讨论】:

  • 我同意。最后它的所有可执行文件。但我的目标是将内容写入文件目录中的 files.txt 中。以及尝试写入 file.txt 的代码 sn-p,我希望它位于源目录中的 newfile.cpp 中。有了这个,你能帮我在不使用绝对路径信息的情况下写入我想要的路径吗?
  • @user1998463:“以及尝试写入 file.txt 的代码 sn-p,我希望它位于源目录中的 newfile.cpp 中”。请确保了解写入 file.txt 的源代码在哪里并不重要。 “../files/file.txt”的路径植根于进程的当前目录(默认情况下,这是您正在运行的应用程序所在的位置)。因此,要使其正常工作,您需要根据您提供的文件树将您的应用程序放入 source/ 或 header/ 文件夹中,这可能不是您想要的。
  • 谢谢你paxdiablo。这有帮助
猜你喜欢
  • 2017-10-07
  • 2013-02-21
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 2018-10-11
相关资源
最近更新 更多