_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 は、この例で使用されている base
と nameTemplate
の値に対して _mktemp
が作成できる最後の一意のファイル名です。
失敗した場合は、errno
が設定されます。 nameTemplate
形式が無効な場合 (たとえば、6 文字未満の X 文字)、errno
はEINVAL
に設定されます。 使用可能な 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
、 _wtempnam
、 tmpnam
、 _wtmpnam
tmpfile
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示