C言語編 標準ライブラリのリファレンス tmpnam

先頭へ戻る

tmpnam関数

概要 ファイルの名前を生成する。
ヘッダ stdio.h
形式 char* tmpnam(char* s);
引数 s 生成されたファイルの名前を受け取る配列を指すポインタ。あるいはヌルポインタ。
ヌルポインタ以外を指定する場合、そのポインタが指す配列は L_tmpnam以上の文字数が格納できるだけの容量を必要とする。
戻り値 引数s がヌルポインタでなければ、s を返す。引数s がヌルポインタであれば、関数内で静的記憶域期間を持った配列にファイル名が格納され、これを指すポインタを返す。
いずれの場合も、失敗するとヌルポインタを返す。
詳細 他のファイルと衝突することのない名前を生成する。生成された名前を使って、fopen関数を呼び出すことができる。こうして新規に生成されたファイルは、tmpfile関数のような一時ファイルではなく、自動的に削除されるようなことはない。削除を行うには、remove関数を使う。
この関数は、TMP_MAXマクロで定義された回数分までの呼び出ししか保証されていない。この回数を超えて呼び出すと、一意な名前が生成される保証がなくなる。ただし、TMP_MAX の値以下の回数であっても、生成される名前が既に既存のファイルで使用されている可能性があり、この場合はその名前を返せない。
注意 引数s をヌルポインタにした場合は、静的記憶域期間を持つ変数にファイル名が格納されて、これを指すポインタが返される。従って、この関数を再度、引数s をヌルポインタにして呼び出した際、以前の情報は上書きされる可能性がある。
この関数がファイル名が生成してから、実際に fopen関数などの関数がファイルを作成するまでの間に、他のプログラムが同じ名前のファイルを生成する可能性がある。このようなケースは、セキュリティ上、重大な問題になるかも知れない。
また、作成された一時ファイルは、他のプログラムからもアクセスできてしまうことも問題になり得る。実行環境における事情をよく調査すること。安全性を高めた非標準の関数が用意されていることもある。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE* fp;
    char fname[L_tmpnam];

    if( tmpnam( fname ) == NULL ){
        fputs( "ファイル名の生成に失敗。", stderr );
        exit( EXIT_FAILURE );
    }


    fp = fopen( fname, "w" );
    if( fp == NULL ){
        fputs( "ファイルオープンに失敗。", stderr );
        exit( EXIT_FAILURE );
    }

    printf( "%s を生成しました。\n", fname );
    fputs( "Test Message\n", fp );

    if( fclose( fp ) == EOF ){
        fputs( "ファイルクローズに失敗しました。\n", stderr );
        exit( EXIT_FAILURE );
    }

    if( remove( fname ) == 0 ){
        printf( "%s を削除しました。\n", fname );
    }
    else{
        fprintf( stderr, "%s の削除に失敗しました。\n", fname );
    }

    return 0;
}

実行結果:

C:\Users\____\AppData\Local\Temp\scw8.0 を生成しました。
C:\Users\____\AppData\Local\Temp\scw8.0 を削除しました。

実行結果(生成されたファイル):

Test Message

関連 一時ファイルを作るには tmpfile関数を使う方が良い。ただし、環境ごとに用意されているより安全なバージョンがあるのなら、そちらを使った方が良いかも知れない。
解説章


参考リンク

更新履歴

'2018/4/20 「NULL」という表記を「ヌルポインタ」に修正。

'2018/4/18 全体的に文章を見直し修正。
「使用例」を修正。生成されたファイル名の出力と、最後にファイルを削除する処理を追加した。

'2018/1/22 新規作成。





標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS