如何在C++中使用相对路径打开文件?

11

我现在正在编写测试用例,我创建了一些测试文件并尝试读取它们。绝对路径为:

/home/user/code/Project/source/Project/components/Project/test/file.dat

但是使用绝对路径进行测试是有明显缺陷的。因此,我试图将绝对路径转换为相对路径,但我不知道为什么它不起作用。我创建了一个具有相对路径的文件。

findme.dat

我在其中找到了它

->

and I found it in

/home/user/code/Project/build/source/Project/components/Project/test/findme.dat

所以我创建了相对路径

/../../../../../../source/Project/components/Project/test/file.dat

但该文件未打开,且未与is对象关联, std::ifstream is (path);,并且is.is_open()函数返回false。

你能帮我吗?


你的程序当前工作目录是什么?你提供的路径必须相对于CWD。另外,由于你以“/”开头的路径表示从根目录开始,而根目录没有父目录,这意味着“/..”与“/”相同,导致你的路径等于“/source/Project/components/Project/test/file.dat”。 - Some programmer dude
这完全取决于当前的工作目录,即您的程序所放置的位置。 - usamazf
你的“相对”路径不是相对路径。 它应该以点号开头而不是斜杠。 例如:./../../../../../../source/Project/components/Project/test/file.dat。 - George Michael
谢谢大家,你们帮了很多忙! - Peter111
更新:对于C++17+:https://en.cppreference.com/w/cpp/filesystem/path - Andrew
1个回答

18
您正在使用的路径并不是相对路径。当然,您使用的是相对路径语法,但并非实际含义。
这个路径以 / 开头,表示根目录,然后找到它的父级,由于根目录没有父级,因此返回根,并继续... 这个路径的简化版本如下:
/source/Project/components/Project/test/file.dat
所以它会在根目录中查找 source 文件夹,而该文件夹显然不存在。
您应该这样做(假设您的代码在项目文件夹中):
./test/file.dat
或者如果它在 Project 文件夹内的另一个文件夹中,您可以这样做:
../test/file.dat
.. / 带您到当前代码目录的父级,在这种情况下假定为 Project。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接