tmpnam_s, _wtmpnam_s
生成可用于创建临时文件的名称。 这些是 tmpnam 和 _wtmpnam 的版本与安全增强的 CRT中的安全功能如中所述。
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 |
返回值 |
目录 str |
NULL |
任何 |
EINVAL |
不修改 |
不是 NULL (指向有效的内存) |
太短 |
ERANGE |
不修改 |
如果 str 是 NULL,无效参数调用处理程序,如 参数验证所述。 如果执行允许继续,对 EINVAL 的这些功能集 errno 和返回 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 是 INT_MAX 时)。
自动tmpnam_s 处理多字节字符串参数根据需要,识别多字节字符序列根据操作系统获得的 OEM 代码页。 _wtmpnam_s 是 tmpnam_s的宽字符版本;参数和返回 _wtmpnam_s 的值是宽字符字符串。 _wtmpnam_s 和 tmpnam_s 具有相同的行为,但 _wtmpnam_s 不处理多字节字符字符串。
在 C++ 中,使用这些功能由模板重载简化;重载可以自动推断缓冲区长度,而无需指定范围参数。 有关更多信息,请参见 安全模板重载。
一般文本例程映射
TCHAR.H 实例 |
未定义的 _UNICODE _MBCS |
定义的 _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。有关更多信息,请参见 平台调用示例。