2016-10-22 144 views
-1

我很惭愧,因为无法解决这个问题,但我无法完成这项工作。我有这个简短的测试:ifstream无法找到文件

std::string archnom = "../data/uniform.txt"; 
ifstream archin(archnom.c_str()); 
ASSERT(archin.good()); 

断言是抛出错误。由于某种原因,它没有找到uniform.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

不要紧,你的程序文件。当你执行它时,当前的工作目录是什么? – melpomene

+0

问题是你需要确定什么是你的进程的当前目录。与所有当代流行的点对点GUI IDE相比,这是利用cc/gcc的shell提示来学习破解C++的“老派”的优势之一:无论如何,您绝对不会有任何疑问,并且你永远不会对你当前的目录是什么以及所有文件的位置感到困惑。 –

+0

@melpomene它是项目的根源。我刚刚编辑过 –

回答

2

在终端中,您可以键入./build/a.out以启动a.out程序,并将./作为当前工作目录。

当您这样做时,程序中使用的相对路径是相对于./ dir - 而不是包含该程序的路径。

例如,如果我想开ex.txt运行./build/a.out时(和ex.txt是在同一个目录中建立),我的程序应该有相对路径./ex.txt - ../ex.txt

+0

我不认为我完全理解你想说什么......你能详细说明一点吗? –

1
std::string archnom = "../data/uniform.txt"; 

告诉那uniform.txt可以回到一个目录,然后成数据找到该程序。

但是程序在什么目录下查找?好问题。该位置称为工作目录,不幸的是它移动。通常,工作目录从程序运行的目录开始,而不是程序的位置。为了增加兴奋感,您的程序可以在运行时更改工作目录。

所以,如果你的程序是/首页/鲍勃/代码和uniform.txt文件是/首页/鲍勃/数据和你/首页/鲍勃/代码运行程序./程序一切都很好。工作目录是/首页/鲍勃/代码和程序返回一个文件夹,然后成数据

如果你在/首页/鲍勃/工作区你跑../code/program。工作目录是/home/bob/workspace并且程序返回一个文件夹并且进入数据

但是如果你运行程序//home/bob/code/program?工作目录是/。你不能真的回到任何地方,你能吗?

让我们尝试一个不太极端的情况:/etc。程序返回到/并转发给...老鼠。没有数据目录。

如果uniform.txt文件总是在同一个地方,并且这个地方是有保证的,那么请使用固定的路径。如果uniform.txt将在程序的安装目录附近,程序需要知道它在哪里,并且that takes OS specific code

1

您需要确保当前工作目录是您期望的目录。你可以通过使用_chdir(win32)或chdir(gcc)以及使用argv [0](其中包含当前正在运行的可执行文件的路径)来完成。

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

Change the current working directory in C++