次の方法で共有


_mktemp, _wmktemp

一意のファイル名を作成します。 これらの関数のセキュリティを強化したバージョンを使用できます。「_mktemp_s_wmktemp_s」を参照してください。

構文

char *_mktemp(
   char *nameTemplate
);
wchar_t *_wmktemp(
   wchar_t *nameTemplate
);
template <size_t size>
char *_mktemp(
   char (&nameTemplate)[size]
); // C++ only
template <size_t size>
wchar_t *_wmktemp(
   wchar_t (&nameTemplate)[size]
); // C++ only

パラメーター

nameTemplate
ファイル名のパターン。

戻り値

これらの各関数は、変更された nameTemplate へのポインターを返します。 nameTemplate形式が正しくない場合、または指定された nameTemplate から一意の名前を作成できない場合、関数はNULLを返します。

解説

_mktemp 関数は、nameTemplate 引数を変更することで、一意のファイル名を作成します。 _mktemp は、ランタイム システムによって現在使用中のマルチバイト コード ページに従ってマルチバイト文字シーケンスを認識し、マルチバイト文字列の引数を適切な方法で自動的に処理します。 ワイド文字を扱う場合は、_wmktemp ではなく _mktemp を使用します。_wmktemp の場合、引数にはワイド文字列を指定します。また戻り値もワイド文字列です。 _wmktemp_wmktempがマルチバイト文字列を処理しない点を除き、_mktempは同じように動作します。

既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。

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

Tchar.h のルーチン _UNICODE_MBCS が定義されていない _MBCS が定義されている _UNICODE が定義されている
_tmktemp _mktemp _mktemp _wmktemp

nameTemplate 引数の形式は baseXXXXXX です。ここで base は新しいファイル名の一部として指定される内容であり、各 X は _mktemp によって指定される文字のプレースホルダーです。 nameTemplate 内の各プレースホルダー文字は大文字の X である必要があります。_mktemp では、base を保持し、最初の後続の X を英字 1 文字で置換します。 _mktemp は、末尾の X 文字を 5 桁の値に置き換えます。 この値は、呼び出し元のプロセス、またはマルチスレッド プログラムの呼び出し元スレッドを識別する一意の番号です。

呼び出しが成功した _mktemp ごとに、nameTemplate が変更されます。 同じプロセスまたはスレッドによる同じ nameTemplate 引数を使用した後続の呼び出しごとに、_mktemp では、以前の呼び出しで _mktemp が返した名前と一致するファイル名がないかチェックします。 指定した名前のファイルが存在しない場合、_mktemp はその名前を返します。 以前に返したすべての名前のファイルが存在する場合、_mktemp は、以前返した名前で使用していた英字 1 文字を、次の使用可能な小文字 1 文字 ('a' から 'z' の順) で置換することで、新しい名前を作成します。 たとえば、base が次の値で、

fn

_mktemp によって提供される 5 桁の値が 12345 の場合、返される最初の名前は、次のようになります。

fna12345

この名前を使用してファイル FNA12345 が作成され、このファイルがまだ使用されている場合、nameTemplate に同じ base を使用する同じプロセスまたはスレッドからの呼び出しで返される次の名前は、次のようになります。

fnb12345

FNA12345が存在しない場合、返される次の名前はもう一度です。

fna12345

_mktemp では、 base 値と nameTemplate 値の任意の組み合わせに対して最大 26 個の一意のファイル名を作成できます。 そのため、FNZ12345 は、この例で使用されている basenameTemplate の値に対して _mktemp が作成できる最後の一意のファイル名です。

失敗した場合は、errno が設定されます。 nameTemplate形式が無効な場合 (たとえば、6 文字未満の X 文字)、errnoEINVALに設定されます。 使用可能な 26 個のファイル名がすべて既に存在するため、 _mktemp が一意の名前を作成できない場合、 _mktemp は nameTemplate を空の文字列に設定し、 EEXISTを返します。

C++ では、これらの関数にテンプレートのオーバーロードがあります。このオーバーロードは、これらの関数に対応するセキュリティで保護された新しい関数を呼び出します。 詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。

要件

ルーチンによって返される値 必須ヘッダー
_mktemp <io.h>
_wmktemp <io.h> または <wchar.h>

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

// crt_mktemp.c
// compile with: /W3
/* The program uses _mktemp to create
* unique filenames. It opens each filename
* to ensure that the next name is unique.
*/

#include <io.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

char *template = "fnXXXXXX";
char *result;
char names[27][9];

int main( void )
{
   int i;
   FILE *fp;

   for( i = 0; i < 27; i++ )
   {
      strcpy_s( names[i], sizeof( names[i] ), template );
      /* Attempt to find a unique filename: */
      result = _mktemp( names[i] );  // C4996
      // Note: _mktemp is deprecated; consider using _mktemp_s instead
      if( result == NULL )
      {
         printf( "Problem creating the template\n" );
         if (errno == EINVAL)
         {
             printf( "Bad parameter\n");
         }
         else if (errno == EEXIST)
         {
             printf( "Out of unique filenames\n");
         }
      }
      else
      {
         fopen_s( &fp, result, "w" );
         if( fp != NULL )
            printf( "Unique filename is %s\n", result );
         else
            printf( "Cannot open %s\n", result );
         fclose( fp );
      }
   }
}
Unique filename is fna03912
Unique filename is fnb03912
Unique filename is fnc03912
Unique filename is fnd03912
Unique filename is fne03912
Unique filename is fnf03912
Unique filename is fng03912
Unique filename is fnh03912
Unique filename is fni03912
Unique filename is fnj03912
Unique filename is fnk03912
Unique filename is fnl03912
Unique filename is fnm03912
Unique filename is fnn03912
Unique filename is fno03912
Unique filename is fnp03912
Unique filename is fnq03912
Unique filename is fnr03912
Unique filename is fns03912
Unique filename is fnt03912
Unique filename is fnu03912
Unique filename is fnv03912
Unique filename is fnw03912
Unique filename is fnx03912
Unique filename is fny03912
Unique filename is fnz03912
Problem creating the template.
Out of unique filenames.

関連項目

ファイル処理
fopen, _wfopen
_getmbcp
_getpid
_open, _wopen
_setmbcp
_tempnam_wtempnamtmpnam_wtmpnam
tmpfile