我因为无法解决这个问题而感到羞耻,但我无法做到这一点。我有这个简短的测试:
std::string archnom = "../data/uniform.txt";
ifstream archin(archnom.c_str());
ASSERT(archin.good());
断言抛出错误。由于某种原因,它没有找到uniform.txt
文件。项目结构是:
project
---> data/uniform.txt
---> a.out
---> main.txt
我已经尝试过如下更改archnom但没有成功:
std::string archnom = "/data/uniform.txt";
std::string archnom = "./data/uniform.txt";
std::string archnom = "../data/uniform.txt";
std::string archnom = "data/uniform.txt";
这里有什么问题?
答案 0 :(得分:2)
在终端中,您可以键入./build/a.out
以a.out
程序作为当前工作目录启动./
程序。
执行此操作时,程序中使用的相对文件路径相对于./
目录 - 而不是包含程序的文件路径。
例如,如果我想在运行./build/a.out
时打开 ex.txt (并且 ex.txt 与 build位于同一目录中),我的程序应该有相对路径./ex.txt
- 不 ../ex.txt
。
答案 1 :(得分:1)
std::string archnom = "../data/uniform.txt";
告诉程序可以通过返回一个目录然后再转到 data 来找到uniform.txt。
但程序在什么目录中开始查找?好问题。该位置称为工作目录,不幸的是它移动了。通常,工作目录从程序运行的目录开始,而不是程序所在的目录。为了增加兴奋度,您的程序可以在运行时更改工作目录。
因此,如果您的程序位于 / home / bob / code 且uniform.txt文件位于 / home / bob / data ,则您从<运行该程序em> / home / bob / code 与 ./ program 一切都很好。工作目录是 / home / bob / code ,程序返回一个文件夹,然后返回数据。
如果您在 / home / bob / workspace 并运行 ../ code / program ,该怎么办?工作目录是 / home / bob / workspace ,程序返回一个文件夹并进入 data 。
但是如果你使用 / home / bob / code / program 从 / 运行程序呢?工作目录是 / 。你真的无法回到任何地方,是吗?
让我们尝试一个不那么极端的案例: / etc 。程序返回 / 并转发给...老鼠。没有数据目录。
如果uniform.txt文件始终位于同一位置且保证此位置,请使用固定路径。如果uniform.txt将在程序的安装目录附近,您的程序需要知道它的位置和that takes OS specific code。
答案 2 :(得分:1)
您需要确保当前工作目录位于您期望的位置。您可以使用_chdir(win32)或chdir(gcc)并使用argv [0](包含当前正在运行的可执行文件的路径)来实现。
我在这里回答另一个问题时展示了如何做到这一点: