tmpfile、tmpfile_s
From cppreference.com
| ヘッダー <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 がヌルポインタの場合、現在インストールされている制約ハンドラ関数が呼び出されます。
- すべての境界チェック関数と同様に、`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 関数
[編集] 関連項目
| (C11) |
一意なファイル名を返す (関数) |
| C++ ドキュメント (tmpfile)
| |