_mktemp、_wmktemp
一意のファイル名を作成します。これらの関数のセキュリティを強化したバージョンについては、「_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 関数は、ランタイム システムで現在使用されているマルチバイト コード ページに従ってマルチバイト文字シーケンスを認識し、マルチバイト文字列の引数を適切な方法で自動的に処理します。ワイド文字を扱う場合は、_mktemp ではなく _wmktemp を使用します。_wmktemp の場合、引数にはワイド文字列を指定します。また戻り値もワイド文字列です。_wmktemp 関数と _mktemp 関数の動作は、_wmktemp 関数がマルチバイト文字列を扱わない点を除いて同じです。
汎用テキスト ルーチンのマップ
Tchar.h のルーチン |
_UNICODE および _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
_tmktemp |
_mktemp |
_mktemp |
_wmktemp |
base が指定した X は _mktemp で指定された文字のプレースホルダーが新しいファイル名の一部である template の引数にフォーム base があります。template の各プレースホルダー文字には、大文字の X を指定する必要があります。_mktemp は base を保持し、後に続く X のうち先頭の X を英字に置き換えます。_mktemp は 5 桁の値に残りの X を置き換えます ; この値はプログラムの呼び出しプロセスを識別する一意の数字呼び出し元スレッドになります。
_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 に無効な形式 (数が 6 個の X's) の場合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 );
}
}
}
同等の .NET Framework 関数
該当なし標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。