Namespaces
Variants

tmpnam, tmpnam_s

From cppreference.net
< c ‎ | io
定义于头文件 <stdio.h>
char * tmpnam ( char * filename ) ;
(1)
errno_t tmpnam_s ( char * filename_s, rsize_t maxsize ) ;
(2) (C11 起)
#define TMP_MAX        /*unspecified*/
#define TMP_MAX_S      /*unspecified*/
(C11 起)
#define L_tmpnam       /*unspecified*/
#define L_tmpnam_s     /*unspecified*/
(C11 起)
1) 创建一个唯一的有效文件名(长度不超过 L_tmpnam ),并将其存储到 filename 所指向的字符串中。该函数能够生成最多 TMP_MAX 个唯一文件名,但其中部分或全部可能已被文件系统占用,因此不适合作为返回值。
2) (1) 相同,区别在于最多可生成 TMP_MAX_S 个名称,长度不超过 L_tmpnam_s ,并在运行时检测以下错误,同时调用当前安装的 约束处理函数
  • filename_s 是空指针
  • maxsize 大于 RSIZE_MAX
  • maxsize 小于生成的文件名字符串长度
与所有边界检查函数一样,仅当实现定义了 __STDC_LIB_EXT1__ 且用户在包含 <stdio.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整型常量 1 时,才保证 tmpnam_s 可用。

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)
{
    // 注意:编译器/链接器可能会发出安全警告,例如 GCC:
    // "警告:使用 `tmpnam` 存在风险,建议改用 `mkstemp`"
    char* name1 = tmpnam(NULL);
    printf("临时文件名:%s\n", name1);
    char name2[L_tmpnam];
    if (tmpnam(name2))
        printf("临时文件名:%s\n", name2);
    // POSIX 提供 mkstemp。由于标准 C <stdlib.h> 中可能未包含 mkstemp,
    // 可能需要以下声明。
    int mkstemp(char*);
    char name3[] = "/tmp/fileXXXXXX"; // 至少需要六个 'X' ^_^
    int file_descriptor = mkstemp(name3);
    if (file_descriptor != -1)
        printf("临时文件名:%s\n", name3);
    else
        perror("mkstemp");
}

可能的输出:

临时文件名:/tmp/file90dLlR
临时文件名:/tmp/fileY9LWAg
临时文件名:/tmp/filexgv8PF

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 7.21.4.4 tmpnam 函数 (页: TBD)
  • K.3.5.1.2 tmpnam_s 函数 (页: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 7.21.4.4 tmpnam 函数 (页: 222)
  • K.3.5.1.2 tmpnam_s 函数 (页: 427-428)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.21.4.4 tmpnam 函数 (第 303-304 页)
  • K.3.5.1.2 tmpnam_s 函数 (第 587-588 页)
  • C99标准(ISO/IEC 9899:1999):
  • 7.19.4.4 tmpnam函数(页码:269-270)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.9.4.4 tmpnam 函数

参考

返回指向临时文件的指针
(函数)