【发布时间】:2011-12-25 12:25:05
【问题描述】:
我是否总是必须为从 std::fstream 类实例化的对象指定绝对路径?换句话说,有没有办法只指定它们的相对路径,例如项目路径?
【问题讨论】:
标签: c++ fstream relative-path
我是否总是必须为从 std::fstream 类实例化的对象指定绝对路径?换句话说,有没有办法只指定它们的相对路径,例如项目路径?
【问题讨论】:
标签: c++ fstream relative-path
您也可以使用相对路径。但它们与您调用可执行文件的环境有关。
这取决于操作系统,但所有主要系统的行为或多或少都与 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 在 cmets 中所说,关于 fstream 的路径确实没有什么特别之处。但这里是一个使用相对路径的代码示例:
#include <fstream>
int main() {
std::ifstream ifs("../myfile.txt");
... // Do something sensible with the file
}
【讨论】:
fstream::fstream 或fstream::open,就像你传递一个带有绝对路径的字符串一样。
如果您有一个从 C:\Users\Me 运行的 .exe 文件
你想写一个文件到C:\Users\Me\You\text.txt,
那么你需要做的就是添加当前路径运算符.,所以:
std::ifstream ifs(".\\you\\myfile.txt");
会起作用
【讨论】:
$(SolutionDir),这是在项目属性配置页面中定义的宏。我假设所有相对路径都从 $(SolutionDir) 开始。
.// 让它在Linux 上工作,但我期待../ 工作。
您可以使用相对路径。它们被视为与任何其他文件操作的相对路径相同,例如fopen;在这方面,fstream 没有什么特别之处。
具体如何处理它们是实现定义的;它们通常会相对于您进程的当前工作目录进行解释,该目录不一定与您的程序的可执行文件所在的目录相同。某些操作系统还可能提供由 all 共享的单个工作目录线程,因此如果一个线程更改工作目录的同时另一个线程尝试使用相对路径,您可能会得到意想不到的结果。
【讨论】:
行为是特定于操作系统的。因此,处理这个恕我直言的最好方法是让它成为别人的问题。从用户那里读取要作为字符串打开的文件的路径(例如:命令行参数、配置文件、环境变量等),然后将该字符串直接传递给 fstream 的构造函数。记录您的程序的行为方式。
我在这里写了更多关于路径操作的文章:https://stackoverflow.com/a/40980510/2345997
【讨论】:
假设您的项目目录下有一个src 文件夹,而src 文件夹包含另一个tmp_folder 文件夹,其中包含一个名为readMe.txt 的txt 文件。这样txt文件就可以这样读取了
std::ifstream fin("../src/tmp_folder/readMe.txt");
【讨论】:
您可以指定相对于当前目录的路径。在 Windows 上,您可以调用 GetCurrentDirectory 来检索 当前目录 或调用 SetCurrentDirectory 来设置 当前目录。还有一些 CRT 函数可用。
【讨论】:
在 linux 上也可以:
// main.cpp
int main() {
ifstream myFile("../Folder/readme.txt");
// ...
}
假设文件夹结构是这样的:
/usr/Douments/dev/MyProject/main.cpp
/usr/Documents/dev/MyProject/Folder/readme.txt
【讨论】: