tmpnam_s、_wtmpnam_s
生成可用来创建临时文件的名称。 hs3e7355(v=vs.120).mdCRT 中的安全功能所述)。
errno_t tmpnam_s(
char * str,
size_t sizeInChars
);
errno_t _wtmpnam_s(
wchar_t *str,
size_t sizeInChars
);
template <size_t size>
errno_t tmpnam_s(
char (&str)[size]
); // C++ only
template <size_t size>
errno_t _wtmpnam_s(
wchar_t (&str)[size]
); // C++ only
参数
[out] str
将保存生成的名称上。[in] sizeInChars
缓冲区的大小(以字节为单位)。
返回值
这两个函数返回 0,则在成功或失败的错误号。
错误情况
str |
sizeInChars |
返回值 |
Contents of str |
NULL |
any |
EINVAL |
未修改 |
不是 NULL (指向有效的内存) |
太短 |
ERANGE |
未修改 |
如果 str 是 NULL,则会调用无效参数处理程序,如 参数验证 中所述。 如果允许继续执行,则这些函数将 errno 设置为 EINVAL,并返回EINVAL。
备注
这些函数中的每个表达式都返回当前不存在的文件名。 tmpnam_s 返回名称唯一在当前工作目录。 请注意,当文件名前面附有反斜杠且无路径信息时,如\fname21 ,这说明名称在当前工作目录中是有效的。
对于 tmpnam_s,可以在 str中存储此生成的文件名。 tmpnam_s 返回的字符串的最大长度为 L_tmpnam_s,并定义在 STDIO.H。 如果 str 为 NULL,则tmpnam_s将此结果保留在内部静态缓冲区。 因此任何后续调用都会销毁此值。 tmpnam_s 生成的名称包含程序生成的文件名,在首次调用tmpnam_s后,序号文件扩展名在基 32 (.1-.1vvvvvu,在 STDIO.H 的 TMP_MAX_S 为 32,767)。
tmpnam_s 和自动处理多字节字符串参数,并根据操作系统获得的 OEM 代码页识别多字节字符序列。 _wsetlocale_wtmpnam_s 是 tmpnam_s 的宽字符版本,_wtmpnam_s 参数和 的返回值都是宽字符字符串。 _wtmpnam_s 和 tmpnam_s 具有相同的行为,但 _wtmpnam_s 不处理多字节字符字符串。
在 C++ 中,使用这些函数是由重载模板简化;该重载可以自动推断缓冲区长度,而无需指定范围参数。 有关更多信息,请参见安全模板重载。
一般文本例程映射
TCHAR.H 例程 |
_UNICODE & _MBCS not defined |
已定义 _MBCS |
已定义 _UNICODE |
---|---|---|---|
_ttmpnam_s |
tmpnam_s |
tmpnam_s |
_wtmpnam_s |
要求
例程 |
必需的标头 |
---|---|
tmpnam_s |
<stdio.h> |
_wtmpnam_s |
<stdio.h> 或 <wchar.h> |
有关其他兼容性信息,请参见“简介”中的兼容性。
示例
// crt_tmpnam_s.c
// This program uses tmpnam_s to create a unique filename in the
// current working directory.
//
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
char name1[L_tmpnam_s];
errno_t err;
int i;
for (i = 0; i < 15; i++)
{
err = tmpnam_s( name1, L_tmpnam_s );
if (err)
{
printf("Error occurred creating unique filename.\n");
exit(1);
}
else
{
printf( "%s is safe to use as a temporary file.\n", name1 );
}
}
}
.NET Framework 等效项
不适用。若要调用标准 C 函数,请使用 PInvoke。有关更多信息,请参见平台调用示例。