Namespaces
Variants

tmpfile, tmpfile_s

From cppreference.net
< c ‎ | io
ヘッダーで定義 <stdio.h>
FILE * tmpfile ( void ) ;
(1)
errno_t tmpfile_s ( FILE * restrict * restrict streamptr ) ;
(2) (C11以降)
1) 一時ファイルを作成しオープンします。このファイルはバイナリファイルとして更新モードでオープンされます( fopen "wb+" モードを指定した場合と同様)。ファイル名はファイルシステム内で一意であることが保証されています。プログラムの実行期間中に少なくとも TMP_MAX 個のファイルをオープンできます(この制限は tmpnam と共有される可能性があり、 FOPEN_MAX によってさらに制限される場合があります)。
2) (1) と同様であるが、少なくとも TMP_MAX_S 個のファイルを開くことが可能(この制限は tmpnam_s と共有される場合がある)であり、 streamptr が null ポインタの場合、現在インストールされている constraint handler 関数が呼び出される。
すべての境界チェック付き関数と同様に、 tmpfile_s は、実装によって __STDC_LIB_EXT1__ が定義されており、かつユーザーが <stdio.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義している場合にのみ利用可能であることが保証される。

この関数によって作成される一時ファイルは、プログラムが正常終了した際に閉じられ削除されます。異常終了時に削除されるかどうかは実装定義です。

目次

パラメータ

1) (なし)
2) この関数呼び出しによって更新されるポインタへのポインタ

戻り値

1) ファイルに関連付けられたファイルストリームへのポインタ、またはエラーが発生した場合はヌルポインタ。
2) ファイルが正常に作成されオープンされた場合はゼロ、ファイルが作成されなかったかオープンできなかった場合、または streamptr がヌルポインタであった場合は非ゼロ。さらに、成功時には関連付けられたファイルストリームへのポインタが * streamptr に格納され、エラー時にはヌルポインタ値が * streamptr に格納される。

注記

一部の実装(例:古いLinux)では、この関数は実際にファイルシステム上でファイルを作成、オープンし、直ちに削除します:削除されたファイルへのオープン済みファイル記述子がプログラムによって保持されている限り、ファイルは存在しますが、削除されているためその名前はどのディレクトリにも表示されず、他のプロセスがそれをオープンすることはできません。ファイル記述子がクローズされるか、プログラムが(正常または異常に)終了すると、ファイルが占有していた領域はファイルシステムによって回収されます。新しいLinux(バージョン3.11以降、ファイルシステムに依存)では、このような不可視の一時ファイルを open() システムコールの特別なフラグを使用して一括作成します。

一部の実装(例:Windows)では、システムディレクトリに一時ファイルを作成する可能性があるため、昇格された権限が必要です。

#define _POSIX_C_SOURCE 200112L
#include <stdio.h>
#include <unistd.h>
int main(void)
{
    printf("TMP_MAX = %d, FOPEN_MAX = %d\n", TMP_MAX, FOPEN_MAX);
    FILE* tmpf = tmpfile();
    fputs("Hello, world", tmpf);
    rewind(tmpf);
    char buf[6];
    fgets(buf, sizeof buf, tmpf);
    printf("got back from the file: '%s'\n", buf);
    // Linux-specific method to display the tmpfile name
    char fname[FILENAME_MAX], link[FILENAME_MAX] = {0};
    sprintf(fname, "/proc/self/fd/%d", fileno(tmpf));
    if (readlink(fname, link, sizeof link - 1) > 0)
        printf("File name: %s\n", link);
}

出力例:

TMP_MAX = 238328, FOPEN_MAX = 16
got back from the file: 'Hello'
File name: /tmp/tmpfjptPe5 (deleted)

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 7.21.4.3 tmpfile関数 (p: TBD)
  • K.3.5.1.1 tmpfile_s関数 (p: TBD)
  • C17規格 (ISO/IEC 9899:2018):
  • 7.21.4.3 tmpfile関数 (p: 222)
  • K.3.5.1.1 tmpfile_s関数 (p: 427)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.21.4.3 tmpfile関数 (p: 303)
  • K.3.5.1.1 tmpfile_s関数 (p: 586-587)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.19.4.3 tmpfile関数 (p: 269)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.9.4.3 tmpfile関数

関連項目

一意のファイル名を返す
(関数)