创建唯一的文件名。 这些函数的版本是 _mktemp、_wmktemp,具有安全性增强功能,如 CRT 中的安全功能中所述。
语法
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
_mktemp_s 中单字节字符的缓冲区大小;_wmktemp_s 中的宽字符,包括空终止符。
返回值
如果成功,这两个函数返回零;如果失败,则返回错误代码。
错误条件
| nameTemplate | sizeInChars | 返回值 | nameTemplate中的新值 | 
|---|---|---|---|
| NULL | any | EINVAL | NULL | 
| 格式不正确(请参阅“备注”部分查看正确格式) | any | EINVAL | 空字符串 | 
| 任意 | <= X 字符数 | EINVAL | 空字符串 | 
如果发生上述错误情况中的任何一个,都会调用无效参数处理程序,如参数验证中所述。 如果允许继续执行,则将 errno 设置为 EINVAL 并且函数将返回 EINVAL。
备注
_mktemp_s 函数通过修改 nameTemplate 参数创建唯一的文件名,以便在调用后,nameTemplate 指针指向包含新文件名的字符串。 _mktemp_s 根据需要自动处理多字节字符字符串参数,并根据运行时系统根据当前使用的多字节代码页识别多字节字符序列。 _wmktemp_s 是 _mktemp_s 的宽字符版本;_wmktemp_s 的参数是宽字符字符串。 _wmktemp_s 和 _mktemp_s 的行为方式相同,只不过 _wmktemp_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。 _mktemp_s 将后面的 X 字符替换为五位数值。 此值是一个唯一数字,用于标识调用进程,或者在多线程程序中标识调用线程。
每次成功调用 _mktemp_s 都将修改 nameTemplate。 在来自具有相同的 nameTemplate 参数的相同进程或线程的每个后续调用中,_mktemp_s 将检查与以前的调用中的 _mktemp_s 返回的名称匹配的文件名。 如果给定名称的文件不存在,_mktemp_s 将返回该名称。 如果之前返回的所有名称的文件都存在,_mktemp_s 会通过将之前返回的名称中使用的字母字符替换为下一个可用小写字母(按从“a”到“z”的顺序)来创建新名称。 例如,如果 base 为:
fn
并且 _mktemp_s 提供的五位数值为 12345,则返回的第一个名称为:
fna12345
如果此名称用于创建文件 FNA12345 并且此文件仍存在,则来自具有相同的 base(适用于 nameTemplate)的相同进程或线程的调用返回的下一个名称为:
fnb12345
如果 FNA12345 不存在,则返回的下一个名称又是:
fna12345
_mktemp_s 可以为 base 和 nameTemplate 值的任意给定组合创建最多 26 个唯一文件名。 因此,FNZ12345 是 _mktemp_s 可为本示例中使用的 base 和 nameTemplate 值创建的最后一个唯一文件名。
在 C++ 中,使用这些函数由模板重载简化;重载可以自动推导出缓冲区长度 (不再需要指定大小自变量),并且它们可以自动用以更新、更安全的对应物替换旧的、不安全的函数。 有关详细信息,请参阅安全模板重载。
要求
| 例程 | 必需的标头 | 
|---|---|
| _mktemp_s | <io.h> | 
| _wmktemp_s | <io.h> 或 <wchar.h> | 
有关兼容性的详细信息,请参阅 兼容性。
示例
// 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