tmpnam, tmpnam_s
提供: cppreference.com
ヘッダ <stdio.h> で定義 | ||
char*tmpnam(char*filename ); | (1) | |
errno_t tmpnam_s(char*filename_s, rsize_t maxsize); | (2) | (C11以上) |
1) 有効な一意なファイル名 (長さが L_tmpnam より長くない) を作成し、それを
filename
の指す文字列に格納します。 この関数は一意なファイル名を最大 TMP_MAX 個生成することができますが、そのうちのいくつかはすでにファイルシステム内で使用されていて戻り値に適さない可能性があります。2)(1) と同じですが、最大 TMP_MAX_S 個の名前を生成することができ、長さは L_tmpnam_s より長くなく、以下のエラーを実行時に検出し、現在設定されている制約ハンドラを呼びます。
filename_s
がヌルポインタ。maxsize
が RSIZE_MAX より大きい。maxsize
が生成されたファイル名文字列より短い。
- すべての境界チェック付き関数と同様に、
tmpnam_s
は __STDC_LIB_EXT1__ が処理系によって定義されていて、<stdio.h>
をインクルードする前にユーザが __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ、利用可能であることが保証されます。
tmpnam
および tmpnam_s
は静的な状態 (これらの関数間で共有されているかもしれません) を変更します。 スレッドセーフであることは要求されていません。
目次 |
[編集]引数
filename | - | 結果のバッファとして使用される、少なくとも L_tmpnam バイトを保持できる文字配列を指すポインタ。 ヌルポインタが渡された場合は、内部の静的なバッファを指すポインタが返されます。 |
filename_s | - | 結果のバッファとして使用される、少なくとも L_tmpnam_s バイトを保持できる文字配列を指すポインタ。 |
maxsize | - | 関数が書き込むことができる最大文字数 (一般的には filename_s 配列のサイズ)。 |
[編集]戻り値
1)
filename
がヌルポインタでなければ filename
。 そうでなければ内部の静的なバッファを指すポインタが返されます。 適切な名前を生成できなければ、ヌルポインタが返されます。2) 成功した場合はゼロを返し、ファイル名を
filename_s
に書き込みます。 エラーが発生した場合は非ゼロを返し、ヌル文字を filename_s[0]
に書き込みます (filename_s
がヌルでなく、 maxsize
がゼロでなく RSIZE_MAX より大きくない場合のみ)。[編集]ノート
tmpnam
によって生成される名前は推測が困難ではありますが、 tmpnam
が戻った瞬間とプログラムがその返された名前を使用してファイルの作成を試みる瞬間の間に、別のプロセスがその名前のファイルを作成することは可能です。 標準の関数 tmpfile および POSIX の関数 mkstemp には、この問題がありません (標準 C ライブラリのみを使用して一意なディレクトリを作成するためには、やはり tmpnam
を使用する必要があります)。
POSIX システムは、ディレクトリを選ぶことができる (デフォルトはオプションで定義されるマクロ P_tmpdir
です) 似た名前の関数 tempnam()
を追加で定義しています。
[編集]例
Run this code
出力例:
temporary file name: /tmp/fileRZHMwL temporary file name: /tmp/file420gSN
[編集]参考文献
- C11 standard (ISO/IEC 9899:2011):
- 7.21.4.4 The tmpnam function (p: 303-304)
- K.3.5.1.2 The tmpnam_s function (p: 587-588)