tmpnam, tmpnam_s

来自cppreference.com
< c‎ | io
 
 
文件输入/输出
类型与对象
函数
文件访问
直接输入/输出
无格式输入/输出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)
有格式输入
 
在标头 <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 才保证可用。

tmpnamtmpnam_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 系统额外定义名称类似的函数 <code>tempnam</code> ,它提供对目录的选择(默认是可选定义的宏 <code>P_tmpdir</code> )。

示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(void)
{
    // 注意,编译器/连接器可能会发出安全警告,比如 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 提供了 mkstemp。
    // 由于未出现于 <stdlib.h>,可能需要以下声明。
    int mkstemp(char*);
 
    char name3[] = "/tmp/fileXXXXXX"; // 需要至少六个 'X' ^_^
    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 The tmpnam function (第 TBD 页)
  • K.3.5.1.2 The tmpnam_s function (第 TBD 页)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.21.4.4 The tmpnam function (第 222 页)
  • K.3.5.1.2 The tmpnam_s function (第 427-428 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.21.4.4 The tmpnam function (第 303-304 页)
  • K.3.5.1.2 The tmpnam_s function (第 587-588 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.19.4.4 The tmpnam function (第 269-270 页)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.9.4.4 The tmpnam function

参阅

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