web-dev-qa-db-ja.com

相対パスでfstreamオブジェクトを使用する方法は?

std::fstreamクラスからインスタンス化されたオブジェクトの絶対パスを常に指定する必要がありますか?つまり、プロジェクトパスなど、それらへの相対パスのみを指定する方法はありますか?

24
user336359

相対パスも使用できます。ただし、これらは実行可能ファイルを呼び出す環境に関連しています。

これは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
}
17
Kleist

.exeから実行されているC:\Users\Meファイルがあり、C:\Users\Me\You\text.txtにファイルを書き込みたい場合は、現在のパス演算子.を追加するだけです。 、 そう:

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

働くでしょう

11
Samer

相対パスを使用できます。 fopenなどの他のファイル操作の相対パスと同じように扱われます。その点でfstreamについて特別なことは何もありません。

それらがどのように扱われるかは、実装によって定義されます。通常、プロセスの現在の作業ディレクトリに関連して解釈されます。これは、プログラムの実行可能ファイルが存在するディレクトリと必ずしも同じではありません。一部のオペレーティングシステムでは、allそのため、別のスレッドが相対パスを使用しようとすると同時にスレッドが作業ディレクトリを変更すると、予期しない結果が生じる可能性があります。

2
Rob Kennedy

プロジェクトディレクトリの直下にsrcフォルダーがあり、srcフォルダーにはtmp_folderという名前のtxtファイルを含む別のreadMe.txtフォルダーが含まれているとします。したがって、txtファイルはこの方法で読み取ることができます

std::ifstream fin("../src/tmp_folder/readMe.txt");
1
Martin

動作はOS固有です。したがって、このIMHOを処理する最良の方法は、他の誰かの問題にすることです。ファイルのパスを読み取り、ユーザーから文字列として開きます(例:コマンドライン引数、設定ファイル、env変数など)。その文字列をfstreamのコンストラクターに直接渡します。これがプログラムの動作であることを文書化します。

ここでパス操作について詳しく書きました: https://stackoverflow.com/a/40980510/2345997

1
user1976

現在のディレクトリからの相対パスを指定できます。 Windowsでは、GetCurrentDirectoryを呼び出して現在のディレクトリを呼び出すか、SetCurrentDirectoryを呼び出して現在のディレクトリを設定できます。使用可能なCRT機能もいくつかあります。

0
0902horn

Linuxでも:

// main.cpp
int main() {
    ifstream myFile("../Folder/readme.txt");
    // ...
}

フォルダ構造が次のようなものであると仮定します。

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

0
A-Sharabiani