tmpnam, tmpnam_s
来自 cppreference.cn
定义于头文件 <stdio.h> |
||
char *tmpnam( char *filename ); |
(1) | |
errno_t tmpnam_s(char *filename_s, rsize_t maxsize); |
(2) | (C11 起) |
#define TMP_MAX /*未指定*/ |
||
#define TMP_MAX_S /*未指定*/ |
(C11 起) | |
#define L_tmpnam /*未指定*/ |
||
#define L_tmpnam_s /*未指定*/ |
(C11 起) | |
1) 创建一个唯一有效的临时文件名(长度不超过 L_tmpnam),并将其存储在 filename 指向的字符字符串中。此函数能够生成多达 TMP_MAX 个唯一文件名,但其中部分或全部可能已被文件系统使用,因此不适合作为返回值。
2) 功能与 (1) 相同,但可以生成多达 TMP_MAX_S 个名称,长度不超过 L_tmpnam_s。此外,在运行时会检测以下错误并调用当前已安装的 约束处理函数:
- filename_s 是空指针
- maxsize 大于 RSIZE_MAX
- maxsize 小于生成的文件名字符串长度
- 与所有边界检查函数一样,
tmpnam_s
仅在实现定义了 __STDC_LIB_EXT1__ 且用户在包含 <stdio.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整数常量 1 时才保证可用。
tmpnam 和 tmpnam_s 会修改静态状态(可能在这些函数之间共享),并且不要求是线程安全的。
目录 |
[编辑] 参数
filename | - | 指向字符数组的指针,该数组至少能容纳 L_tmpnam 字节,用作结果缓冲区。如果传入空指针,则返回指向内部静态缓冲区的指针。 |
filename_s | - | 指向字符数组的指针,该数组至少能容纳 L_tmpnam_s 字节,用作结果缓冲区。 |
maxsize | - | 函数允许写入的最大字符数(通常是 filename_s 数组的大小)。 |
[编辑] 返回值
1) 如果 filename 不是空指针,则返回 filename。否则,返回指向内部静态缓冲区的指针。如果无法生成合适的文件名,则返回空指针。
2) 成功时返回零,并将文件名写入 filename_s。出错时返回非零值,并将空字符写入 filename_s[0](仅当 filename_s 非空且 maxsize 非零且不大于 RSIZE_MAX 时)。
[编辑] 注意
尽管 tmpnam
生成的名称难以猜测,但在 tmpnam
返回和程序尝试使用返回的名称创建文件之间,仍可能存在另一个进程创建同名文件的情况。标准函数 tmpfile 和 POSIX 函数 mkstemp
没有此问题(仅使用标准 C 库创建唯一目录仍然需要使用 tmpnam
)。
POSIX 系统还定义了类似的函数 tempnam
,它允许选择目录(默认为可选定义的宏 P_tmpdir
)。
[编辑] 示例
运行此代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { // Note, the compiler/linker may issue a security warning, e.g. GCC: // "warning: the use of `tmpnam' is dangerous, better use `mkstemp'" 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); // POSIX offers mkstemp. The following declaration might be // necessary as mkstemp is absent in the standard C <stdlib.h>. int mkstemp(char*); char name3[] = "/tmp/fileXXXXXX"; // at least six 'X' required ^_^ int file_descriptor = mkstemp(name3); if (file_descriptor != -1) printf("temporary file name: %s\n", name3); else perror("mkstemp"); }
可能的输出
temporary file name: /tmp/file90dLlR temporary file name: /tmp/fileY9LWAg temporary file name: /tmp/filexgv8PF
[编辑] 参考资料
- C23 标准 (ISO/IEC 9899:2024)
- 7.21.4.4 tmpnam 函数 (p: TBD)
- K.3.5.1.2 tmpnam_s 函数 (p: TBD)
- C17 标准 (ISO/IEC 9899:2018)
- 7.21.4.4 tmpnam 函数 (p: 222)
- K.3.5.1.2 tmpnam_s 函数 (p: 427-428)
- C11 标准 (ISO/IEC 9899:2011)
- 7.21.4.4 tmpnam 函数 (p: 303-304)
- K.3.5.1.2 tmpnam_s 函数 (p: 587-588)
- C99 标准 (ISO/IEC 9899:1999)
- 7.19.4.4 tmpnam 函数 (p: 269-270)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 4.9.4.4 tmpnam 函数
[编辑] 参阅
(C11) |
返回指向临时文件的指针 (函数) |
C++ 文档 关于 tmpnam
|