请参阅C ++项目中的数据文件

时间:2012-01-30 17:31:14

标签: c++ coding-style

我有一个C ++项目,其文件夹结构如下:

root/trunk
root/trunk/src/...        
root/trunk/include/...    
root/trunk/utils/...      <-- this has the `main` programs which are compiled
root/trunk/bin/...        compiled binaries
root/data/...             data used in the programs

在我的源文件中,我有时会引用数据子文件夹中包含的文件。我希望我使用的路径是相对路径(因为我与其他人共享此项目)。

如何确保始终可以找到数据文件?目前我使用如下路径:

std::string my_data("../../../data/path/to/file.txt");

但是,我发现很难用它来计算相对路径所在的位置,并且在移动源文件时会很麻烦。是完成同样事情的更好方法吗?

4 个答案:

答案 0 :(得分:2)

您不应该对程序运行时当前工作目录的内容做出任何假设 - 使用更健壮的方法来确定数据文件的位置,这不依赖于工作目录设置为任何内容特别是。通过将工作目录设置为与程序无关的位置进行测试,然后从那里运行它,例如

$ cd /tmp
$ /path/to/my/program/root/trunk/bin/my_program

并查看它是否正常运行。

答案 1 :(得分:2)

在继续之前,您需要定义一个交付目录 结构体;其他用户在安装代码时会看到的内容。然后, 从那开始:在Windows下,您可以使用该功能 GetModuleFileName找到二进制文件的位置,并从中工作 那;在Unix下,传统上要求用户设置 环境变量,类似于MYPROJ_ROOT,并将其用作 树的根。无论哪种方式,你都有一个起点;你想要你的 文件名相对于此,到当前工作目录。 您可以通过更改当前工作目录来执行此操作 您的流程(Windows下为SetCurrentDirectory,Unix下为chdir), 或者(我的首选解决方案)使用boost::filesystem之类的东西 从根名称建立绝对名称。

答案 2 :(得分:1)

组织数据文件的常用方法是在程序启动时建立“数据根”文件夹,然后相对于此编码路径。数据根可以通过搜索(当前目录,也许是其父,祖父等等,直到真正的根目录)自动确定特定命名的文件或目录(例如“.foo”),并由环境变量覆盖或命令行开关(例如FOO_DATA_DIR =“/ home / fred / bar”)。

为方便起见,程序可以将其当前工作目录更改为数据根目录,或者您可以在用户空间中以编程方式解析数据根目录相对路径。

答案 3 :(得分:0)

在您的问题中没有足够的代码来确切地了解您正在做什么,但在过去,我已经使用__FILE__预处理器宏(以及随后删除的文件名/目录)来引用文件它们与源文件所在的位置相关:

http://www.codeguru.com/forum/showthread.php?t=380822