_tempnam, _wtempnam, tmpnam, _wtmpnam

一時ファイルの作成に使用できる名前を生成します。 これらの関数の一部のより安全なバージョンを利用できます。を参照してくださいtmpnam_s_wtmpnam_s

構文

char *_tempnam(
   const char *dir,
   const char *prefix
);
wchar_t *_wtempnam(
   const wchar_t *dir,
   const wchar_t *prefix
);
char *tmpnam(
   char *str
);
wchar_t *_wtmpnam(
   wchar_t *str
);

パラメーター

prefix
によって返される名前の前に付加される _tempnam文字列。

dir
TMP 環境変数がない場合、または TMP が有効なディレクトリでない場合に、ファイル名で使用されるパス。

str
生成された名前を保持するポインター。関数によって返される名前と同じです。 生成された名前を保存する便利な方法です。

戻り値

これらの各関数は、生成された名前へのポインター、または NULL エラーが発生した場合に、ポインターを返します。 エラーが発生する可能性があります TMP_MAX (STDIO を参照してください。H) 環境変数とパラメーターに tmpnam 無効なディレクトリ名が指定されている場合、または使用 _tempnam する TMP 場合に呼び出 dir します。

Note

tmpnam_wtmpnam によって返されるポインターは、内部の静的バッファーを指します。 free これらのポインターの割り当てを解除するために呼び出す必要はありません。 _tempnam および _wtempnam によって割り当てられたポインターに対して、free を呼び出す必要があります。

解説

これらの各関数は、現在存在しないファイルの名前を返します。 tmpnam は、返される指定された Windows 一時ディレクトリ内で一意の名前を GetTempPathW返します。 _tempnam は、指定されたディレクトリ以外のディレクトリに一意の名前を生成します。 ファイル名の先頭に円記号が付いていて、パス情報がない場合は、 \fname21現在の作業ディレクトリに対して名前が有効であることを示します。

tmpnam については、この生成されたファイル名を str で格納することができます。 strNULL の場合、tmpnam は内部の静的バッファーに結果を残します。 したがって後続の呼び出しは、この値を破棄します。 tmpnam によって生成された名前を構成しているのは、プログラムで生成されたファイル名と、tmpnam への最初の呼び出しの後は base 32 で連番のファイル拡張子 (STDIO.H 内の TMP_MAX が 32,767 の場合、.1-.vvu) です。

_tempnam は、次の規則によって選択されたディレクトリの一意のファイル名を生成します。

  • TMP 環境変数が定義され、有効なディレクトリ名に設定されている場合、TMP で指定されたディレクトリに対して一意のファイル名が生成されます。

  • TMP 環境変数が定義されていない場合、または存在しないディレクトリの名前に設定されている場合は、 _tempnam 一意の名前を生成するパスとしてパラメーターを使用 dir します。

  • TMP 環境変数が定義されていない場合、または存在しないディレクトリの名前に設定されている場合、または存在しないディレクトリの名前に設定されている場合 dirNULL_tempnam 現在の作業ディレクトリを使用して一意の名前を生成します。 現時点では、TMP と dir 存在しないディレクトリの名前の両方を指定すると、 _tempnam 関数呼び出しは失敗します。

返される _tempnam 名前は、連結 prefix された連番であり、指定したディレクトリの一意のファイル名を作成するために結合されます。 _tempnam は、拡張機能を持たないファイル名を生成します。 _tempnam はファイル名のスペースを割り当てるために使用 malloc します。不要になった場合、プログラムはこのスペースを解放する役割を担います。

_tempnam および tmpnam は、オペレーティング システムから取得した OEM コード ページに従ってマルチバイト文字シーケンスを認識し、マルチバイト文字列の引数を適切な方法で自動的に処理します。 ワイド文字を扱う場合は、_tempnam ではなく _wtempnam を使用します。_wtempnam の場合、引数にはワイド文字列を指定します。また戻り値もワイド文字列です。 _wtempnam がマルチバイト文字列を処理しない点を除き、_wtempnam_tempnam の動作は同じです。 ワイド文字を扱う場合は、_wtmpnam ではなく tmpnam を使用します。_wtmpnam の場合、引数にはワイド文字列を指定します。また戻り値もワイド文字列です。 _wtmpnam がマルチバイト文字列を処理しない点を除き、_wtmpnamtmpnam の動作は同じです。

定義されている場合_DEBUG_tempnam_CRTDBG_MAP_ALLOCおよび呼び出_wtempnam_dbg_tempnam_dbg_wtempnamに置き換えられます。

汎用テキスト ルーチンのマップ

TCHAR.H のルーチン _UNICODE_MBCS が定義されていない _MBCS が定義されている _UNICODE が定義されている
_ttmpnam tmpnam tmpnam _wtmpnam
_ttempnam _tempnam _tempnam _wtempnam

必要条件

ルーチンによって返される値 必須ヘッダー
_tempnam <stdio.h>
_wtempnam, _wtmpnam <stdio.h> または <wchar.h>
tmpnam <stdio.h>

互換性の詳細については、「 Compatibility」を参照してください。

// crt_tempnam.c
// compile with: /W3
// This program uses tmpnam to create a unique filename in the
// temporary directory, and _tempname to create a unique filename
// in C:\\tmp.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char * name1 = NULL;
   char * name2 = NULL;
   char * name3 = NULL;

   // Create a temporary filename for the current working directory:
   if ((name1 = tmpnam(NULL)) != NULL) { // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf("%s is safe to use as a temporary file.\n", name1);
   } else {
      printf("Cannot create a unique filename\n");
   }

   // Create a temporary filename in temporary directory with the
   // prefix "stq". The actual destination directory may vary
   // depending on the state of the TMP environment variable and
   // the global variable P_tmpdir.

   if ((name2 = _tempnam("c:\\tmp", "stq")) != NULL) {
      printf("%s is safe to use as a temporary file.\n", name2);
   } else {
      printf("Cannot create a unique filename\n");
   }

   // When name2 is no longer needed:
   if (name2) {
      free(name2);
   }

   // Unset TMP environment variable, then create a temporary filename in C:\tmp.
   if (_putenv("TMP=") != 0) {
      printf("Could not remove TMP environment variable.\n");
   }

   // With TMP unset, we'll use C:\tmp as the temporary directory.
   // Create a temporary filename in C:\tmp with prefix "stq".
   if ((name3 = _tempnam("c:\\tmp", "stq")) != NULL) {
      printf("%s is safe to use as a temporary file.\n", name3);
   }
   else {
      printf("Cannot create a unique filename\n");
   }

   // When name3 is no longer needed:
   if (name3) {
      free(name3);
   }

   return 0;
}
C:\Users\LocalUser\AppData\Local\Temp\sriw.0 is safe to use as a temporary file.
C:\Users\LocalUser\AppData\Local\Temp\stq2 is safe to use as a temporary file.
c:\tmp\stq3 is safe to use as a temporary file.

関連項目

ストリーム入出力
_getmbcp
malloc
_setmbcp
tmpfile
tmpfile_s