_mktemp_s, _wmktemp_s

创建唯一的文件名。这些是 _mktemp, _wmktemp 的版本与安全增强的 CRT中的安全功能如中所述。

errno_t _mktemp_s(
   char *template,
   size_t sizeInChars
);
errno_t _wmktemp_s(
   wchar_t *template,
   size_t sizeInChars
);
template <size_t size>
errno_t _mktemp_s(
   char (&template)[size]
); // C++ only
template <size_t size>
errno_t _wmktemp_s(
   wchar_t (&template)[size]
); // C++ only

参数

  • template
    文件名模式。

  • sizeInChars
    缓冲区的大小在单字节字符的在 _mktemp_s;在 _wmktemp_s的宽字符,包括 null 结束符。

返回值

这两个函数返回在成功为零;在失败的错误代码。

错误状态

template

sizeInChars

返回值

在模板的新值

NULL

任何

EINVAL

NULL

不正确的格式 (对于正确的格式参见 Remarks 部分)

任何

EINVAL

空字符串

任何

X's 的 AMP_LT= 数字

EINVAL

空字符串

如果任何一个上述错误状态,当无效参数调用处理程序,如 参数验证所述。如果执行允许继续, errno 设置为 EINVAL ,并且函数返回 EINVAL。

备注

_mktemp_s 功能通过修改 template 参数创建唯一的文件名,,因此,在调用, template 指针指向包含新文件名后的字符串。自动_mktemp_s 处理多字节字符串参数根据需要,识别多字节字符顺序基于多字节代码页当前正在使用由运行时系统。_wmktemp_s 是 _mktemp_s的宽字符版本; _wmktemp_s 的参数是宽字符字符串。_wmktemp_s 和 _mktemp_s 否则方法的行为,除此之外, _wmktemp_s 不处理多字节字符字符串。

一般文本例程映射

Tchar.h 实例

未定义的 _UNICODE 和 _MBCS

定义的 _MBCS

定义的 _UNICODE

_tmktemp_s

_mktemp_s

_mktemp_s

_wmktemp_s

template 参数有窗体, base 是新的部分文件名为,并且每个 X 是 _mktemp_s提供的字符的占位符。在 template 的每个占位符必须是大写的 X。_mktemp_s 保留 base 并用一个字母替换第一个尾随 X。_mktemp_s 用一个五位数的值替换以下尾随 X's;此值是确定调用的单个进程数,或在多线程程序中,调用线程。

成功的每个调用 _mktemp_s 修改 template。中的每个从相同的后续调用进程或线程具有相同 template 参数,在前面的 _mktemp_s 返回的匹配名称调用文件名的 _mktemp_s 检查。如果文件为给定名称不存在, _mktemp_s 返回该名称。如果文件为所有先前返回的名称存在, _mktemp_s 通过替换字母创建它与下一个可用的小写字母的先前返回的名称使用的新名称,按顺序,从 " a " 到 “z。例如,因此,如果 base 是:

fn

并 _mktemp_s 中提供的五位数的值为 12345,则返回的名称为:

fna12345

如果此名称用于创建文件 FNA12345,并且此文件仍然存在,在从相同的调用返回的下一个名称处理或具有相同 base 的线程 template 的是:

fnb12345

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

fna12345

_mktemp_s 可以创建最多 26 个文件名 foundation 和模板值的所有特定组合。因此, FNZ12345 是最后一个唯一文件名 _mktemp_s 能用于此示例中使用的 base 和 template 值创建。

在 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

.NET Framework 等效项

不适用。若要调用标准 C 函数,请使用 PInvoke。有关更多信息,请参见 平台调用示例

请参见

参考

文件处理

fopen, _wfopen

_getmbcp

_getpid

_open, _wopen

_setmbcp

_tempnam, _wtempnam, tmpnam, _wtmpnam

tmpfile_s