我是否总是必须为从std::fstream
类实例化的对象指定绝对路径?换句话说,有没有办法指定它们的相对路径,例如项目路径?
答案 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