Share via


_mktemp、_wmktemp

更新 : 2007 年 11 月

一意のファイル名を作成します。これらの関数のセキュリティを強化したバージョンについては、「_mktemp_s、_wmktemp_s」を参照してください。

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

パラメータ

  • template
    ファイル名のパターン。

戻り値

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

解説

_mktemp 関数は、template 引数を変更して、一意のファイル名を作成します。_mktemp 関数は、ランタイム システムで現在使用中のマルチバイト コード ページに従って、マルチバイト文字シーケンスを認識し、必要に応じて、マルチバイト文字列の引数を自動的に処理します。_wmktemp は _mktemp のワイド文字列バージョンなので、_wmktemp の引数と戻り値もワイド文字列です。ワイド文字列を除いては、_wmktemp と _mktemp の動作は同じです。ただし、_wmktemp は、マルチバイト文字列を処理しません。

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

Tchar.h のルーチン

_UNICODE および _MBCS が未定義の場合

_MBCS が定義されている場合

_UNICODE が定義されている場合

_tmktemp

_mktemp

_mktemp

_wmktemp

template 引数の形式は baseXXXXXX です。ここで、base は、指定した新しいファイル名の一部で、X は、_mktemp で指定された文字のプレースホルダです。template の各プレースホルダ文字には、大文字の X を指定する必要があります。_mktemp は、base を保持し、後に続く X のうち先頭の X を英字に置き換えます。さらに、_mktemp は、残りの X を 5 桁の値に置き換えます。この値は、呼び出し元プロセス (マルチスレッド プログラムの場合は呼び出し元スレッド) を識別する一意の数字です。

_mktemp の呼び出しが成功するたびに、template が変更されます。同じ template 引数を使用して同じプロセスまたはスレッドから呼び出されると、_mktemp は、前の呼び出しで _mktemp から返された名前と一致するファイル名を調べます。指定した名前のファイルが存在しない場合、_mktemp はその名前を返します。以前返されたすべての名前のファイルが存在する場合、_mktemp は、その名前の英字部分をアルファベット順の次の小文字に置き換えて、新しい名前を作成します。たとえば、base が次のような場合があります。

fn

さらに、_mktemp で指定した 5 桁の値が 12345 の場合、最初に次の名前が返されます。

fna12345

この名前が FNA12345 ファイルの作成に使用され、そのファイルがまだ存在する場合、template に同じ base を指定して同じプロセスまたはスレッドを呼び出すと、次の名前が返されます。

fnb12345

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

fna12345

_mktemp は、base 値と template 値をどのように組み合わせても、最大で 26 個の一意のファイル名を作成できます。したがって、この例で使用されている base 値と template 値に対して _mktemp が作成できる最後の一意のファイル名は FNZ12345 になります。

失敗した場合は、errno が設定されます。template の形式が無効である場合 (たとえば、X が 6 未満の場合)、errno は EINVAL に設定されます。26 個のすべてのファイル名が既に存在することが原因で、_mktemp が一意の名前を作成できない場合、_mktemp は、テンプレートを空の文字列に設定し、EEXIST を返します。

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

必要条件

ルーチン

必須ヘッダー

_mktemp

<io.h>

_wmktemp

<io.h> または <wchar.h>

互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。

使用例

// 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.

.NET Framework の相当するアイテム

適用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。

参照

参照

ファイル処理

fopen、_wfopen

_getmbcp

_getpid

_open、_wopen

_setmbcp

_tempnam、_wtempnam、tmpnam、_wtmpnam

tmpfile