std::tmpfile
| ヘッダ <cstdio> で定義
|
||
std::FILE* tmpfile(); |
||
自動生成された一意なファイル名を持つ一時ファイルを作成して開きます。
ファイルは (アクセスモードに "wb+" を指定した std::fopen によって行われたかのように) 更新用にバイナリファイルとして開かれます。 少なくとも TMP_MAX 個のファイルをプログラムの生存期間中に開くことができます (この制限は std::tmpnam と共有されているかもしれず、さらに FOPEN_MAX によって制限されるかもしれません)。
プログラムがファイルを閉じた場合 (例えば std::fclose を実行することによって)、ファイルは自動的に削除されます。
プログラムが正常終了した場合 (std::exit を呼ぶ、または main から戻るなどによって)、 std::tmpfile によって開かれたすべてのファイルは自動的に削除されます。
プログラムが異常終了した場合、これらの一時ファイルが削除されるかどうかは処理系定義です。
引数
(なし)
戻り値
紐付けられたファイルストリーム、またはエラーが発生した場合は NULL。
ノート
処理系によっては (Linux など)、この関数はファイルシステム上に実際にファイルを作成し、開き、そして直ちに削除します。 削除されたファイルへの開いているファイルディスクリプタがプログラムによって保持されている限りそのファイルは存在しますが、削除されているためいかなるディレクトリ内にもその名前は現れず、そのため他のプロセスが開くことはできません。 ファイルディスクリプタが閉じられれば、そのファイルが占めていた空間はファイルシステムによって回収されます。
処理系によっては (Windows など)、この関数がシステムディレクトリ内に一時ファイルを作成することができるように、特権の昇格が要求されます。
例
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
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';
// tmpfile の名前を表示する Linux 特有の方法
std::cout << fs::read_symlink(
fs::path("/proc/self/fd") / std::to_string(fileno(tmpf))
) << '\n';
}
出力例:
Hello
"/tmp/tmpfBlY1lI (deleted)"
関連項目
| 一意なファイル名を返します (関数) | |
(C++17) |
テンポラリファイルに適したディレクトリを返します (関数) |
tmpfile の C言語リファレンス
| |