如何使用相对路径来操作 fstream 对象?

49

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


更新:对于C++17+:https://en.cppreference.com/w/cpp/filesystem/path - Andrew
8个回答

37

你也可以使用相对路径。但是它们是相对于你从中调用可执行文件的环境而言的。

这取决于操作系统,但据我所知,所有主要的系统行为都大致相同。

例如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。如果从根目录调用myprogram.exe,则只有绝对路径才能工作,但是"myfile.txt"将起作用。
正如Rob Kennedy在评论中所说,关于fstream的路径实际上没有什么特别之处。但是这里是一个使用相对路径的代码示例:
#include <fstream>
int main() {
    std::ifstream ifs("../myfile.txt");
    ... // Do something sensible with the file
}

如何做 什么,@用户?如果您有一个包含相对路径的字符串,您可以像处理绝对路径的字符串一样将其传递给 fstream::fstreamfstream::open - Rob Kennedy

20

如果你有一个从C:\Users\Me运行的.exe文件, 并且你想要将一个文件写入到C:\Users\Me\You\text.txt, 那么你所需要做的就是添加当前路径操作符.,如下:

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

能够正常工作


1
从你的评论中得到的提示是,所有的项目都有一个默认的根目录 $(SolutionDir),这是在项目属性配置页面中定义的一个宏。我假设所有的相对路径都是从$(SolutionDir)开始的。 - tom_mai78101
由于某种原因,这是答案,但我不知道为什么。我使用了.//来使其在Linux上工作,但我本来期望../可以工作。 - Andrew

4
你可以使用相对路径。它们与其他文件操作(如 fopen)的相对路径相同;在这方面,fstream 没有什么特别之处。
它们的处理方式是由实现定义的; 它们通常会相对于您的进程的当前工作目录进行解释,但这不一定与您的程序可执行文件所在的目录相同。一些操作系统可能还提供一个所有线程共享的单个工作目录,因此,如果一个线程在另一个线程尝试使用相对路径时更改了工作目录,则可能会得到意外的结果。

2
假设您的项目目录下直接有一个名为 src 的文件夹,并且该文件夹包含另一个名为 tmp_folder 的文件夹,其中包含一个名为 readMe.txt 的文本文件。因此可以通过以下方式阅读该文本文件。
std::ifstream fin("../src/tmp_folder/readMe.txt");

1
在Linux上也是这样的:
// main.cpp
int main() {
    ifstream myFile("../Folder/readme.txt");
    // ...
}

假设文件夹结构如下:

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


1
行为取决于操作系统。因此,我认为处理这个问题的最佳方式是让其他人来解决。从用户读取要打开文件的路径(例如:命令行参数、配置文件、环境变量等),然后直接将该字符串传递给fstream的构造函数。记录下这是你程序的行为方式。
我在这里写了更多关于路径操作的内容: https://dev59.com/RWkw5IYBdhLWcg3wp8Sc#40980510

0

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


0

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