tmpnam
tmpnam, tmpnam_s
在头文件 | | |
---|---|---|
char * tmpnam(char * filename); | (1) | |
errno_t tmpnam_s(char * filename_s,rsize_t maxsize); | (2) | (自C11以来) |
1)创建唯一的有效文件名(不超过L_tmpnam
长度)并将其存储在指向的字符串中filename
。该功能能够生成多达TMP_MAX
独特的文件名,但其中一些或全部可能正在文件系统中使用,因此不适合返回值。
2)与(1)相同,除了TMP_MAX_S
可以生成名称不超过L_tmpnam_s
长度,并且在运行时检测到以下错误并调用当前安装的约束处理函数:
filename_s
是一个空指针
作为所有的边界检查函数,tmpnam_s只能保证__STDC_LIB_EXT1__是由实现定义的,并且如果用户在包含之前定义__STDC_WANT_LIB_EXT1__为整数常量。 1<stdio.h>
tmpnam
并tmpnam_s
修改静态(可以在这些函数之间共享)并且不要求线程安全。
参数
文件名 | - | 指向能够保存至少L_tmpnam字节的字符数组的指针,用作结果缓冲区。如果传递了空指针,则返回指向内部静态缓冲区的指针。 |
---|---|---|
filename_s | - | 指向能够保存至少L_tmpnam_s字节的字符数组的指针,用作结果缓冲区。 |
MAXSIZE | - | 函数允许写入的最大字符数(通常是filename_s数组的大小)。 |
返回值
1)filename
如果filename
不是空指针。否则,返回指向内部静态缓冲区的指针。如果不能生成合适的文件名,则返回空指针。
2)返回零并将文件名写入filename_s
成功。在错误,返回非零和空字符写入filename_s[0]
(仅当filename_s
不为null且maxsize
不是零和不大于RSIZE_MAX
)。
注意
虽然生成的名称tmpnam
很难猜出,但是有可能在tmpnam
返回时刻和此程序尝试使用返回的名称创建文件之间由另一个进程创建具有该名称的文件。标准函数tmpfile
和POSIX函数mkstemp没有这个问题(仅使用标准C库创建唯一目录仍然需要使用tmpnam
)。
POSIX系统另外定义了类似命名的函数tempnam()
,它提供了一个目录的选择(默认为可选定义的宏。P_tmpdir)
例
#include <stdio.h>
#include <string.h>
int main(void)
{
char* name1 = tmpnam(NULL
printf("temporary file name: %s\n", name1
char name2[L_tmpnam];
if (tmpnam(name2))
printf("temporary file name: %s\n", name2
}
可能的输出:
temporary file name: /tmp/fileRZHMwL
temporary file name: /tmp/file420gSN
参考
- C11标准(ISO / IEC 9899:2011):