如何使用具有相对路径的fstream对象

How to use fstream objects with relative path?

本文关键字:fstream 对象 路径 相对 何使用      更新时间:2023-10-16

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

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

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

Windows的例子:

// File structure:
c:foldermyprogram.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
}

如果您有一个.exe文件从C:UsersMe运行你想写一个文件到C:UsersMeYoutext.txt,那么你所需要做的就是添加当前路径操作符.,所以:

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

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

如何处理它们是由实现定义的;它们通常会相对于进程的当前工作目录进行解释,该目录不一定与程序的可执行文件所在的目录相同。有些操作系统可能还提供一个由所有线程共享的单一工作目录,所以如果一个线程在另一个线程试图使用相对路径的同时更改了工作目录,您可能会得到意想不到的结果。

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

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

该行为是操作系统特有的。因此,在我看来,处理这个问题的最好方法是把它变成别人的问题。从用户那里读取要打开的文件的路径(例如:命令行参数,配置文件,env变量等),然后将该字符串直接传递给fstream的构造函数。说明这是程序的行为方式。

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

linux:

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

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

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

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

我最终使用的是一个相对路径,如如何在c++中使用相对路径打开文件?结果是:

myFile.open("../Release/frequency.dat", ios::in);

*将myFile更改为变量