_mktemp_s、_wmktemp_s_mktemp_s, _wmktemp_s

一意のファイル名を作成します。Creates a unique file name. これらは、「CRT のセキュリティ機能」の説明にあるとおり、セキュリティが強化されたバージョンの _mktemp、_wmktemp です。These are versions of _mktemp, _wmktemp with security enhancements as described in Security Features in the CRT.

構文Syntax

errno_t _mktemp_s(
   char *nameTemplate,
   size_t sizeInChars
);
errno_t _wmktemp_s(
   wchar_t *nameTemplate,
   size_t sizeInChars
);
template <size_t size>
errno_t _mktemp_s(
   char (&nameTemplate)[size]
); // C++ only
template <size_t size>
errno_t _wmktemp_s(
   wchar_t (&nameTemplate)[size]
); // C++ only

パラメーターParameters

nameTemplatenameTemplate
ファイル名のパターン。File name pattern.

sizeInCharssizeInChars
_Mktemp_s の1バイト文字のバッファーのサイズ。null ターミネータを含む _wmktemp_s のワイド文字。Size of the buffer in single-byte characters in _mktemp_s; wide characters in _wmktemp_s, including the null terminator.

戻り値Return Value

これらの関数のどちらも、成功した場合は 0 を返し、エラーの場合はエラー コードを返します。Both of these functions return zero on success; an error code on failure.

エラー条件Error Conditions

nameTemplatenameTemplate sizeInCharssizeInChars 戻り値Return value Nametemplate の新しい値New value in nameTemplate
NULLNULL anyany EINVALEINVAL NULLNULL
形式が正しくありません (正しい形式については、「解説」を参照してください)Incorrect format (see Remarks section for correct format) anyany EINVALEINVAL 空の文字列empty string
anyany X の数以下<= number of X's EINVALEINVAL 空の文字列empty string

上記のいずれかのエラー条件が発生すると、「パラメータの検証」に説明されているように、無効なパラメーター ハンドラ―が呼び出されます。If any of the above error conditions occurs, the invalid parameter handler is invoked, as described in Parameter Validation. 実行の継続が許可された場合、 errnoeinval に設定され、関数は einval を返します。If execution is allowed to continue, errno is set to EINVAL and the functions returns EINVAL.

解説Remarks

_Mktemp_s 関数は、 nametemplate 引数を変更することによって一意のファイル名を作成します。そのため、呼び出しの後に、 nametemplate ポインターは、新しいファイル名を含む文字列を指します。The _mktemp_s function creates a unique file name by modifying the nameTemplate argument, so that after the call, the nameTemplate pointer points to a string containing the new file name. は、ランタイムシステムが現在使用しているマルチバイトコードページに従ってマルチバイト文字のシーケンスを認識し、マルチバイト文字列の引数を適切な方法で自動的に処理します。 _mktemp_s_mktemp_s automatically handles multibyte-character string arguments as appropriate, recognizing multibyte-character sequences according to the multibyte code page currently in use by the run-time system. _wmktemp_s_mktemp_s のワイド文字バージョンです。 _wmktemp_s の引数は、ワイド文字列です。_wmktemp_s is a wide-character version of _mktemp_s; the argument of _wmktemp_s is a wide-character string. _wmktemp_s_mktemp_s は、 _wmktemp_s がマルチバイト文字列を処理しない点を除いて、同じように動作します。_wmktemp_s and _mktemp_s behave identically otherwise, except that _wmktemp_s does not handle multibyte-character strings.

これらの関数のデバッグライブラリバージョンは、最初にバッファーを0xFE で埋めます。The debug library versions of these functions first fill the buffer with 0xFE. この動作を無効にするには、_CrtSetDebugFillThreshold を使用します。To disable this behavior, use _CrtSetDebugFillThreshold.

既定では、この関数のグローバル状態はアプリケーションにスコープが設定されています。By default, this function's global state is scoped to the application. これを変更するには、「 CRT でのグローバル状態」を参照してください。To change this, see Global state in the CRT.

汎用テキスト ルーチンのマップGeneric-Text Routine Mappings

Tchar.h のルーチンTchar.h routine _UNICODE および _MBCS が未定義の場合_UNICODE and _MBCS not defined _MBCS が定義されている場合_MBCS defined _UNICODE が定義されている場合_UNICODE defined
_tmktemp_s_tmktemp_s _mktemp_s_mktemp_s _mktemp_s_mktemp_s _wmktemp_s_wmktemp_s

Nametemplate 引数の形式は basexxxxxx です。ここで、 base は指定する新しいファイル名の一部で、各 X は _mktemp_s によって提供される文字のプレースホルダーです。The nameTemplate argument has the form baseXXXXXX, where base is the part of the new file name that you supply and each X is a placeholder for a character supplied by _mktemp_s. Nametemplate 内の各プレースホルダー文字は、大文字の x である必要があります。 _mktemp_sbase を保持し、最初の末尾の x をアルファベット文字に置き換えます。Each placeholder character in nameTemplate must be an uppercase X. _mktemp_s preserves base and replaces the first trailing X with an alphabetic character. _mktemp_s は、次の末尾の X を5桁の値に置き換えます。この値は、呼び出し元のプロセスを識別する一意の番号、またはマルチスレッドプログラムでの呼び出し元のスレッドを示します。_mktemp_s replaces the following trailing X's with a five-digit value; this value is a unique number identifying the calling process, or in multithreaded programs, the calling thread.

_Mktemp_s の呼び出しが成功するたびに、 nametemplate が変更されます。Each successful call to _mktemp_s modifies nameTemplate. 同じ Nametemplate 引数を持つ同じプロセスまたはスレッドからの後続の呼び出しでは、 _mktemp_s は、前の呼び出しで _mktemp_s によって返された名前と一致するファイル名を確認します。In each subsequent call from the same process or thread with the same nameTemplate argument, _mktemp_s checks for file names that match names returned by _mktemp_s in previous calls. 指定された名前のファイルが存在しない場合、 _mktemp_s はその名前を返します。If no file exists for a given name, _mktemp_s returns that name. 以前に返されたすべての名前のファイルが存在する場合、 _mktemp_s は、以前に返された名前で使用されていた英字を ' a ' から ' z ' の順に使用可能な次の小文字で置き換えることによって、新しい名前を作成します。If files exist for all previously returned names, _mktemp_s creates a new name by replacing the alphabetic character it used in the previously returned name with the next available lowercase letter, in order, from 'a' through 'z'. たとえば、 base がの場合は次のようになります。For example, if base is:

1億fn

_mktemp_s によって指定された5桁の値は12345であり、最初に返される名前は次のとおりです。and the five-digit value supplied by _mktemp_s is 12345, the first name returned is:

fna12345fna12345

この名前を使用してファイル FNA12345 を作成しても、このファイルがまだ存在する場合、 Nametemplate の同じ ベース を持つ同じプロセスまたはスレッドから次の名前が返されます。If this name is used to create file FNA12345 and this file still exists, the next name returned on a call from the same process or thread with the same base for nameTemplate is:

fnb12345fnb12345

FNA12345 が存在しない場合、次に返される名前はもう一度次のようになります。If FNA12345 does not exist, the next name returned is again:

fna12345fna12345

_mktemp_s は、 Basenametemplate の値の任意の組み合わせに対して最大26個の一意のファイル名を作成できます。_mktemp_s can create a maximum of 26 unique file names for any given combination of base and nameTemplate values. したがって、FNZ12345 は、この例で使用される base および nametemplate の値に対して作成できる _mktemp_s 最後の一意のファイル名です。Therefore, FNZ12345 is the last unique file name _mktemp_s can create for the base and nameTemplate values used in this example.

C++ では、これらの関数の使用はテンプレートのオーバーロードによって簡素化されます。オーバーロードでは、バッファー長を自動的に推論できる (サイズの引数を指定する必要がなくなる) だけでなく、古くてセキュリティが万全ではない関数を新しく安全な関数に自動的に置き換えることができます。In C++, using these functions is simplified by template overloads; the overloads can infer buffer length automatically (eliminating the need to specify a size argument) and they can automatically replace older, non-secure functions with their newer, secure counterparts. 詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。For more information, see Secure Template Overloads.

必要条件Requirements

ルーチンによって返される値Routine 必須ヘッダーRequired header
_mktemp_s_mktemp_s <io.h>
_wmktemp_s_wmktemp_s <io.h> または <wchar.h><io.h> or <wchar.h>

互換性について詳しくは、「 Compatibility」をご覧ください。For more compatibility information, see Compatibility.

Example

// crt_mktemp_s.cpp
/* The program uses _mktemp to create
* five unique filenames. It opens each filename
* to ensure that the next name is unique.
*/

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

char *fnTemplate = "fnXXXXXX";
char names[5][9];

int main()
{
   int i, err, sizeInChars;
   FILE *fp;

   for( i = 0; i < 5; i++ )
   {
      strcpy_s( names[i], sizeof(names[i]), fnTemplate );
      /* Get the size of the string and add one for the null terminator.*/
      sizeInChars = strnlen(names[i], 9) + 1;
      /* Attempt to find a unique filename: */
      err = _mktemp_s( names[i], sizeInChars );
      if( err != 0 )
         printf( "Problem creating the template" );
      else
      {
         if( fopen_s( &fp, names[i], "w" ) == 0 )
            printf( "Unique filename is %s\n", names[i] );
         else
            printf( "Cannot open %s\n", names[i] );
         fclose( fp );
      }
   }

   return 0;
}

出力例Sample Output

Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188

関連項目See also

ファイルの処理File Handling
fopen、_wfopenfopen, _wfopen
_getmbcp_getmbcp
_getpid_getpid
_open、_wopen_open, _wopen
_setmbcp_setmbcp
_tempnam、_wtempnam、tmpnam、_wtmpnam_tempnam, _wtempnam, tmpnam, _wtmpnam
tmpfile_stmpfile_s