如何使用相对路径的fstream对象?

时间:2011-11-09 17:21:35

标签: c++ fstream relative-path

我是否总是必须为从std::fstream类实例化的对象指定绝对路径?换句话说,有没有办法指定它们的相对路径,例如项目路径?

7 个答案:

答案 0 :(得分:15)

您也可以使用相对路径。但它们与您调用可执行文件的环境有关。

这取决于操作系统,但所有主要系统的行为或多或少都与AFAIK相同。

Windows示例:

// File structure:
c:\folder\myprogram.exe
c:\myfile.txt

// Calling command from folder
c:\folder > myprogram.exe

在上面的示例中,您可以使用“c:/myfile.txt”或“../myfile.txt”访问myfile.txt。如果从根c:\调用myprogram.exe只有绝对路径可以工作,而是“myfile.txt”可以工作。

正如Rob Kennedy在评论中所说,关于fstream的路径真的没什么特别之处。但这是一个使用相对路径的代码示例:

#include <fstream>
int main() {
    std::ifstream ifs("../myfile.txt");
    ... // Do something sensible with the file
}

答案 1 :(得分:11)

如果您的.exe文件从C:\Users\Me开始运行 并且您想要将文件写入C:\Users\Me\You\text.txt, 那么你需要做的就是添加当前路径运算符.,所以:

std::ifstream ifs(".\\you\\myfile.txt");

将起作用

答案 2 :(得分:2)

您可以使用相对路径。对于任何其他文件操作,它们被视为相对路径相同,例如fopen;在这方面fstream并没有什么特别之处。

确切地说,他们如何对待是实施定义的;它们通常会相对于进程的当前工作目录进行解释,该目录不一定与程序的可执行文件所在的目录相同。某些操作系统可能还提供所有共享的单个工作目录线程,因此如果线程在另一个线程尝试使用相对路径的同时更改工作目录,则可能会得到意外结果。

答案 3 :(得分:1)

该行为是特定于操作系统的。因此,处理这个恕我直言的最好方法是使其成为别人的问题。读取文件的路径作为用户打开的字符串(例如:命令行参数,配置文件,env变量等),然后将该字符串直接传递给fstream的构造函数。记录这是您的计划的行为方式。

我在这里写了更多关于路径操作的内容:https://stackoverflow.com/a/40980510/2345997

答案 4 :(得分:1)

假设您的项目目录下直接有src文件夹,src文件夹包含另一个tmp_folder文件夹,其中包含名为readMe.txt的txt文件。所以可以用这种方式读取txt文件

std::ifstream fin("../src/tmp_folder/readMe.txt");

答案 5 :(得分:0)

您可以指定相对于当前目录的路径。在Windows上,您可以调用 GetCurrentDirectory 来检索当前目录,或者调用 SetCurrentDirectory 来设置当前目录。还有一些CRT功能可用。

答案 6 :(得分:0)

在linux上也是:

// main.cpp
int main() {
    ifstream myFile("../Folder/readme.txt");
    // ...
}

假设文件夹结构是这样的:

/usr/Douments/dev/MyProject/main.cpp  /usr/Documents/dev/MyProject/Folder/readme.txt