%>
创建唯一的文件名。 提供这些函数的更安全版本;请参阅 _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
可以为 base
和 nameTemplate
值的任意给定组合创建最多 26 个唯一文件名。 因此,FNZ12345 是 _mktemp
可为本示例中使用的 base
和 nameTemplate
值创建的最后一个唯一文件名。
如果失败,则会设置 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.