Namespaces
Variants

std:: tmpfile

From cppreference.net
< cpp ‎ | io ‎ | c
ヘッダー <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() システムコールの特別なフラグを介して、1ステップで作成されます。

一部の実装(例: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)"

関連項目

一意のファイル名を返す
(関数)
一時ファイルに適したディレクトリを返す
(関数)