_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
文件名模式。
返回值
这些函数都返回一个指向已修改的模板。函数返回 NULL ,如果 template 有格式或不包含其他唯一名称不能从这个特定模板创建。
备注
_mktemp 功能通过修改 template 参数创建唯一的文件名。自动_mktemp 处理多字节字符串参数根据需要,识别多字节字符顺序基于多字节代码页当前正在使用由运行时系统。_wmktemp 是 _mktemp的宽字符版本;参数和返回 _wmktemp 的值是宽字符字符串。_wmktemp 和 _mktemp 否则方法的行为,除此之外, _wmktemp 不处理多字节字符字符串。
一般文本例程映射
Tchar.h 实例 |
未定义的 _UNICODE 和 _MBCS |
定义的 _MBCS |
定义的 _UNICODE |
---|---|---|---|
_tmktemp |
_mktemp |
_mktemp |
_wmktemp |
template 参数具有以下形式 base,其中 base 是为新文件名的一部分,并且每个 X 是 _mktemp提供的字符的占位符。在 template 的每个占位符必须是大写的 X。_mktemp 保留 base 并用一个字母替换第一个尾随 X。_mktemp 用一个五位数的值替换以下尾随 X's;此值是确定调用的单个进程数,或在多线程程序中,调用线程。
成功的每个调用_mktemp 修改 template。中的每个从相同的后续调用进程或线程具有相同 template 参数,在前面的 _mktemp 返回的匹配名称调用文件名的 _mktemp 检查。如果文件为给定名称不存在, _mktemp 返回该名称。如果文件为所有先前返回的名称存在, _mktemp 通过替换字母创建它与下一个可用的小写字母的先前返回的名称使用的新名称,按顺序,从 " a " 到 “z。例如,因此,如果 base 是:
fn
并 _mktemp 中提供的五位数的值为 12345,则返回的名称为:
fna12345
如果此名称用于创建文件 FNA12345,并且此文件仍然存在,在从相同的调用返回的下一个名称处理或具有相同 base 的线程 template 的是:
fnb12345
如果 FNA12345 不存在,则返回的下一个名称将是:
fna12345
_mktemp 可以创建最多 26 个文件名 foundation 和模板值的所有特定组合。因此, FNZ12345 是最后一个唯一文件名 _mktemp 能用于此示例中使用的 base 和 template 值创建。
在失败, errno 设置。如果 template 有一个无效格式 (例如,少于 6 个 X's), errno 设置为 EINVAL。如果 _mktemp 无法创建一个唯一的名称,因为所有 26 个可能的文件名称已经存在, _mktemp 设置模板为空字符串并返回 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 );
}
}
}
.NET Framework 等效项
不适用。若要调用标准 C 函数,请使用 PInvoke。有关更多信息,请参见 平台调用示例。