_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_mktemp 的行为方式相同,只不过 _wmktemp 不处理多字节字符串。

默认情况下,此函数的全局状态范围限定为应用程序。 要更改此行为,请参阅 CRT 中的全局状态

一般文本例程映射

Tchar.h 例程 _UNICODE_MBCS 未定义 _MBCS 已定义 _UNICODE 已定义
_tmktemp _mktemp _mktemp _wmktemp

nameTemplate 自变量的形式为 baseXXXXXX,其中 base 是你提供的新文件名的部分,而每个 X 是 _mktemp 提供的字符的占位符。 nameTemplate 中的每个占位符字符必须为大写 X。_mktemp 保留 base,并使用字母字符替换第一个尾随的 X。 _mktemp 用五位数的值替换尾随的 X 字符。 此值是一个唯一数字,用于标识调用进程,或者在多线程程序中标识调用线程。

每次成功调用 _mktemp 都将修改 nameTemplate。 在来自具有相同的 nameTemplate 参数的相同进程或线程的每个后续调用中,_mktemp 将检查与以前的调用中的 _mktemp 返回的名称匹配的文件名。 如果给定名称的文件不存在,_mktemp 将返回该名称。 如果之前返回的所有名称的文件都存在,_mktemp 会通过将之前返回的名称中使用的字母字符替换为下一个可用小写字母(按从“a”到“z”的顺序)来创建新名称。 例如,如果 base 为:

fn

并且 _mktemp 提供的五位数值为 12345,则返回的第一个名称为:

fna12345

如果此名称用于创建文件 FNA12345 并且此文件仍存在,则来自具有相同的 base(适用于 nameTemplate)的相同进程或线程的调用返回的下一个名称为:

fnb12345

如果 FNA12345 不存在,则返回的下一个名称又是:

fna12345

_mktemp 可以为 basenameTemplate 值的任意给定组合创建最多 26 个唯一文件名。 因此,FNZ12345 是 _mktemp 可为本示例中使用的 basenameTemplate 值创建的最后一个唯一文件名。

如果失败,则会设置 errno。 如果 nameTemplate 格式无效(例如,少于 6 个 X 个字符),则 errno 会设为 EINVAL。 如果 _mktemp 因为所有 26 个可能的文件名都已存在而无法创建唯一名称,_mktemp 会将 nameTemplate 设置为空字符串并返回 EEXIST

在 C++ 中,这些函数具有模板重载,以调用这些函数的更新、更安全副本。 有关详细信息,请参阅安全模板重载

要求

例程 必需的标头
_mktemp <io.h>
_wmktemp <io.h> 或 <wchar.h>

有关兼容性的详细信息,请参阅 兼容性

示例

// 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_wtempnamtmpnam_wtmpnam
tmpfile