std::tmpfile
| ヘッダ <cstdio>で定義 |
||
| std::FILE* tmpfile(); |
||
一意の自動生成されたファイル名を持つ一時ファイルを作成し、開きます。
std::fopen によるアクセスモード"wb+" で、バイナリファイルとして更新用に開かれます。プログラムの実行期間中に、少なくとも TMP_MAX 個のファイルを開くことができます(この制限は std::tmpnam と共有される可能性があり、さらに FOPEN_MAX によって制限される場合があります)。
プログラムがファイルを閉じると(例: std::fclose を実行するなど)、ファイルは自動的に削除されます。
プログラムが正常に終了した場合(std::exit を呼び出した場合、main から戻った場合など)、std::tmpfile を呼び出して開かれたすべてのファイルも自動的に削除されます。
プログラムが異常終了した場合、これらのテンポラリファイルが削除されるかどうかは実装定義です。
目次 |
[編集] パラメータ
(なし)
[編集] 戻り値
関連するファイルストリーム。エラーが発生した場合はヌルポインタ。
[編集] 注記
一部の実装(例: 古い Linux)では、この関数は実際にファイルシステム上に一時ファイルを作成、オープンし、すぐに削除します。プログラムが削除されたファイルへのオープンなファイルディスクリプタを保持している間はファイルは存在しますが、削除されたため、どのディレクトリにも名前が表示されず、他のプロセスが開くことはできません。ファイルディスクリプタが閉じられると、またはプログラムが終了すると(正常終了または異常終了)、ファイルが占有していたスペースはファイルシステムによって再利用されます。新しい Linux(3.11 以降、ファイルシステムによる)では、open() システムコールの特別なフラグを介して、このような見えない一時ファイルを一度に作成します。
一部の実装(例: Windows)では、この関数がシステムディレクトリに一時ファイルを作成する可能性があるため、昇格した権限が必要です。
[編集] 例
#include <cstdio> #include <cstdlib> #include <filesystem> #include <iostream> namespace fs = std::filesystem; int main() { std::cout << "TMP_MAX = " << TMP_MAX << '\n' << "FOPEN_MAX = " << FOPEN_MAX << '\n'; std::FILE* tmpf = std::tmpfile(); std::fputs("Hello, world", tmpf); std::rewind(tmpf); char buf[6]; std::fgets(buf, sizeof buf, tmpf); std::cout << buf << '\n'; // Linux-specific method to display the tmpfile name std::cout << fs::read_symlink( fs::path("/proc/self/fd") / std::to_string(fileno(tmpf)) ) << '\n'; }
実行結果の例
TMP_MAX = 238328 FOPEN_MAX = 16 Hello "/tmp/tmpfBlY1lI (deleted)"
[編集] 関連項目
| 一意なファイル名を返す (関数) | |
| (C++17) |
一時ファイルに適したディレクトリを返す (関数) |
| C ドキュメント (tmpfile)
| |