ifstream无法找到文件

时间:2016-10-22 20:45:53

标签: c++ ifstream

我因为无法解决这个问题而感到羞耻,但我无法做到这一点。我有这个简短的测试:

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";

这里有什么问题?

3 个答案:

答案 0 :(得分:2)

在终端中,您可以键入./build/a.outa.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](包含当前正在运行的可执行文件的路径)来实现。

我在这里回答另一个问题时展示了如何做到这一点:

Change the current working directory in C++