この関数の目的
tmpnam()は、一時ファイル(temporary file)として使える名前を自動生成する。
定義
#include <stdio.h> char *tmpnam(char *s);
働き
この関数は、存在しているどのファイルのものとも一致しないファイル名を生成する。
この関数は、呼ばれるたびに違う文字列を最大で TMP_MAX
回生成する。
TMP_MAX
回以上呼ばれた場合の動作は処理系定義である。
処理系は、どの標準ライブラリ関数も一度も tmpnam() を呼ばないように動作しなければならない。
引数がヌルポインタであった場合、この関数は内部の静的オブジェクトに結果を置きそのオブジェクトへのポインタを返す。
続けて呼んだ場合、このオブジェクトは変更されるかもしれない。
引数がヌルポインタでなかった場合、それは少なくとも L_tmpnam
文字の長さを持つ配列とみなされる。
この配列に結果が書かれ、引数を返す。
TMP_MAX
の値は25以上である。
解説
tmpnam()は、一時的なファイルの名前として使える文字列を自動で作ってくれるので、場合によっては便利な関数である。 この関数を使って得た文字列を使って作ったファイルはプログラム終了時に自動で削除されないので、 手で remove() を使って削除する必要がある。
引数に渡す文字列は少なくとも L_tmpnam
の長さだけ確保されている必要がある、というのは重要な注意である。
これより短かった場合、配列オーバーの危険があるからだ。知ってのとおり、配列オーバーはトップクラスにデバッグが難しいバグであり、再現性も低い。
引数にヌルポインタを渡せば、この関数の内部でファイルの名前を保持してくれるのだが、 これはもう一度ヌルポインタを引数に渡して呼んだら変わってしまうので、2度以上呼ぶ場合は名前を別に保持する必要がある。 そうでないと、2度目の前に fopen() しても、その名前は失われてしまうために remove() ができない。
tmpnam は、 Temporary Name の短縮形だろうと思われる。