如何在包含的C++源代码中编写外部文件的路径

问题描述:

假设我正在编写一个库或一组工具集mytool,其中定义了其他人可以使用的类MyTool。假设我有一个目录树是这样的:如何在包含的C++源代码中编写外部文件的路径

project 
| - program1 
    | - main1.cpp 
... 
| - mytool 
    | - mytool.h 
    | - mytool.cpp 
    | - data.txt 
tool1.cpp

我用的是外部的二进制大文件data.dat

ifsteam f("data.txt"); 

main1.cpp使用mytool,但如果mytool.(s)omain1.o程序链接可以” t找到data.dat,对于这种情况,我需要将上一行更改为:

ifstream f("../mytool/data.txt"); 

,但我不知道其他人把mytool例如,他们可以有不同的目录树:(?我说的对)

project 
| - program1 
    | - main1.cpp 
    | - mytool 
     | - tool1.h 
     | - tool2.cpp 
     | - data.dat 

另外的路径取决于执行程序的地方。

我可以想象的唯一解决方案是传递给类构造器MyTooldata.dat的路径,但我想隐藏该文件供用户使用。

+0

考虑使用'boost :: filesystem' – AJG85 2011-02-23 18:33:40

您需要知道文件的绝对路径,或文件相对于工作目录的路径。一种方法是在编译程序之前有一个用户运行的配置脚本。然后该脚本将硬编码到您的程序的相关路径中,以便程序以为用户定制的方式硬连线。

有时这不是一种选择,因为您不想分发源代码,或者因为您希望允许在运行时更改路径。然后你可以在运行时读取一个配置文件,说明文件的位置。但这只是一个抽象层:你仍然需要知道配置文件的位置。例如,您可能会询问系统用户的个人目录,然后在该目录中找到该文件。这是在编译时和运行时计算路径之间的一种混合。

您需要将二进制文件的位置设置为用户在特定的程序安装中定义的配置值。或者,更简单的是,只要始终将二进制文件放在最终可执行文件所在的位置,并使用“data.dat”作为路径。

一种选择是使用环境变量来定位工具。例如,将其命名为MYTOOLDIR。您可以在安装MyTool时设置路径。拨打getenv("MYTOOLDIR");可以解决此问题。

在windows上,在mytool目录中,运行SETX PATH=%PATH%;./,或在Linux上,只需PATH=$PATH:./。 (提供一个set_env.bat或不能做的事情。)