次の方法で共有


_tempnam_wtempnamtmpnam_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 は、 GetTempPathWによって返される指定された Windows 一時ディレクトリ内で一意の名前を返します。 _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 は、拡張機能を持たないファイル名を生成します。 _tempnammalloc を使用してファイル名の領域を割り当てます。この領域が不要になった場合、プログラムはこの領域を解放する役割を担います。

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

_DEBUG_CRTDBG_MAP_ALLOCが定義されている場合、_tempnam_wtempnamは、_tempnam_dbg_wtempnam_dbgの呼び出しに置き換えられます。

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

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