如何使用具有相对路径的fstream对象
How to use fstream objects with relative path?
我是否总是必须为从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更改为变量
- fstream / ifstream / ofstream 对象如何转换为布尔值
- 有效而干净的方法来编写一个ofstream/fstream对象,以用标头编写表
- 使用 fstream 对象将文件中的信息存储到变量中
- C++是否可以将fstream对象设置为在每次调用<<
- fstream 对象无法被 Visual Studio 的 JIT/Compiler 识别
- 应该多久打开/关闭一次 fstream 对象 c++
- if('fstream 对象')如何返回 true 或 false 的值,具体取决于文件是否已打开?
- 在c++中使用同一个fstream对象进行读写时,是否有任何导致错误的特性
- 自定义文件类中fstream对象的生存期
- fstream对象的文件结束
- 在同一个fstream对象上使用getline的两个函数
- 无法声明 fstream 对象?但是可以将其声明为指针吗?
- 如何使用具有相对路径的fstream对象
- 从内存缓冲区创建fstream对象
- 如何使用fstream对象作为成员变量
- C++使用fstream对象读取和写入文本文件时出现问题
- 可以在类中使用 fstream 对象吗?
- 使用 fstream 对象作为函数参数
- c++中,fstream对象作为引用传递给函数
- 如何为 fstream 对象设置标志FILE_FLAG_BACKUP_SEMANTICS