std::fstream
クラスからインスタンス化されたオブジェクトの絶対パスを常に指定する必要がありますか?つまり、プロジェクトパスなど、それらへの相対パスのみを指定する方法はありますか?
相対パスも使用できます。ただし、これらは実行可能ファイルを呼び出す環境に関連しています。
これはOSに依存しますが、すべての主要なシステムはほぼ同じ動作をします。
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がルートc:\
から呼び出された場合、絶対パスのみが機能しますが、代わりに「myfile.txt」が機能します。
Rob Kennedyがコメントで述べたように、fstreamに関するパスについて特別なことは本当にありません。しかし、相対パスを使用したコード例は次のとおりです。
#include <fstream>
int main() {
std::ifstream ifs("../myfile.txt");
... // Do something sensible with the file
}
.exe
から実行されているC:\Users\Me
ファイルがあり、C:\Users\Me\You\text.txt
にファイルを書き込みたい場合は、現在のパス演算子.
を追加するだけです。 、 そう:
std::ifstream ifs(".\\you\\myfile.txt");
働くでしょう
相対パスを使用できます。 fopen
などの他のファイル操作の相対パスと同じように扱われます。その点でfstream
について特別なことは何もありません。
それらがどのように扱われるかは、実装によって定義されます。通常、プロセスの現在の作業ディレクトリに関連して解釈されます。これは、プログラムの実行可能ファイルが存在するディレクトリと必ずしも同じではありません。一部のオペレーティングシステムでは、allそのため、別のスレッドが相対パスを使用しようとすると同時にスレッドが作業ディレクトリを変更すると、予期しない結果が生じる可能性があります。
プロジェクトディレクトリの直下にsrc
フォルダーがあり、src
フォルダーにはtmp_folder
という名前のtxtファイルを含む別のreadMe.txt
フォルダーが含まれているとします。したがって、txtファイルはこの方法で読み取ることができます
std::ifstream fin("../src/tmp_folder/readMe.txt");
動作はOS固有です。したがって、このIMHOを処理する最良の方法は、他の誰かの問題にすることです。ファイルのパスを読み取り、ユーザーから文字列として開きます(例:コマンドライン引数、設定ファイル、env変数など)。その文字列をfstreamのコンストラクターに直接渡します。これがプログラムの動作であることを文書化します。
ここでパス操作について詳しく書きました: https://stackoverflow.com/a/40980510/2345997
現在のディレクトリからの相対パスを指定できます。 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