_mktemp_s
, _wmktemp_s
一意のファイル名を作成します。 これらの関数は、「CRT のセキュリティ機能」で説明されているように、セキュリティが強化されたバージョンの _mktemp
、_wmktemp
です。
構文
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
パラメーター
nameTemplate
ファイル名のパターン。
sizeInChars
_wmktemp_s
の場合は 1 バイト文字単位、_mktemp_s
の場合はワイド文字単位のバッファー サイズ。null 終端文字を含みます。
戻り値
これらの関数のどちらも、成功した場合は 0 を返し、エラーの場合はエラー コードを返します。
エラー条件
nameTemplate |
sizeInChars |
戻り値 | の新しい値 nameTemplate |
---|---|---|---|
NULL |
任意 | EINVAL |
NULL |
正しくない形式 (正しい形式については「解説」セクションを参照) | 任意 | EINVAL |
空の文字列 |
任意 | <= X 文字の数 | EINVAL |
空の文字列 |
上記のいずれかのエラー状態が発生した場合は、「パラメーターの検証 で説明されているように、無効なパラメーター ハンドラーが呼び出。 実行の継続が許可された場合、errno
が EINVAL
に設定され、関数から EINVAL
が返されます。
解説
_mktemp_s
関数は nameTemplate
引数を変更して一意のファイル名を作成します。したがって、呼び出し後、nameTemplate
ポインターは新しいファイル名を含む文字列を指します。 _mktemp_s
は、ランタイム システムによって現在使用中のマルチバイト コード ページに従ってマルチバイト文字シーケンスを認識し、マルチバイト文字列の引数を適切な方法で自動的に処理します。 _wmktemp_s
は _mktemp_s
のワイド文字バージョンです。_wmktemp_s
の引数はワイド文字列です。 _wmktemp_s
_wmktemp_s
がマルチバイト文字列を処理しない点を除き、_mktemp_s
は同じように動作します。
これらの関数のデバッグ ライブラリ バージョンでは、最初にバッファーを 0xFE で埋めます。 この動作を無効にするには、_CrtSetDebugFillThreshold
を使用します。
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
汎用テキスト ルーチンのマップ
Tchar.h のルーチン | _UNICODE と _MBCS が定義されていない |
_MBCS が定義されている |
_UNICODE が定義されている |
---|---|---|---|
_tmktemp_s |
_mktemp_s |
_mktemp_s |
_wmktemp_s |
nameTemplate
引数の形式は baseXXXXXX
です。ここで base
は新しいファイル名の一部として指定される内容であり、各 X は _mktemp_s
によって指定される文字のプレースホルダーです。 nameTemplate
内の各プレースホルダー文字は大文字の X である必要があります。_mktemp_s
では、base
を保持し、最初の後続の X を英字 1 文字で置換します。 _mktemp_s
は、その後の X 文字を 5 桁の値に置き換えます。 この値は、呼び出し元のプロセス、またはマルチスレッド プログラムの呼び出し元スレッドを識別する一意の番号です。
呼び出しが成功した _mktemp_s
ごとに、nameTemplate
が変更されます。 同じプロセスまたはスレッドによる同じ nameTemplate
引数を使用した後続の呼び出しごとに、_mktemp_s
では、以前の呼び出しで _mktemp_s
が返した名前と一致するファイル名がないかチェックします。 指定した名前のファイルが存在しない場合、_mktemp_s
はその名前を返します。 以前に返したすべての名前のファイルが存在する場合、_mktemp_s
は、以前返した名前で使用していた英字 1 文字を、次の使用可能な小文字 1 文字 ('a' から 'z' の順) で置換することで、新しい名前を作成します。 たとえば、base
が次の値で、
fn
_mktemp_s
によって提供される 5 桁の値が 12345 の場合、返される最初の名前は、次のようになります。
fna12345
この名前を使用してファイル FNA12345 が作成され、このファイルがまだ使用されている場合、nameTemplate
に同じ base
を使用する同じプロセスまたはスレッドからの呼び出しで返される次の名前は、次のようになります。
fnb12345
FNA12345が存在しない場合、返される次の名前はもう一度です。
fna12345
_mktemp_s
では、 base
値と nameTemplate
値の任意の組み合わせに対して最大 26 個の一意のファイル名を作成できます。 そのため、FNZ12345 は、この例で使用されている base
と nameTemplate
の値に対して _mktemp_s
が作成できる最後の一意のファイル名です。
C++ では、これらの関数の使用はテンプレートのオーバーロードによって簡素化されます。オーバーロードでは、バッファー長を自動的に推論できる (サイズの引数を指定する必要がなくなる) だけでなく、古くてセキュリティが万全ではない関数を新しく安全な関数に自動的に置き換えることができます。 詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。
要件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
_mktemp_s |
<io.h> |
_wmktemp_s |
<io.h> または <wchar.h> |
互換性の詳細については、「 Compatibility」を参照してください。
例
// 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;
}
サンプル出力
Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188
関連項目
ファイル処理
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
、 _wtempnam
、 tmpnam
、 _wtmpnam
tmpfile_s