命名空间
变体
操作

tmpnam, tmpnam_s

出自 cppreference.cn
< c‎ | io
 
 
文件输入/输出
类型和对象
        
函数
文件访问
(C95)
无格式输入/输出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

格式化输入
直接输入/输出
格式化输出
文件定位
错误处理
文件操作
tmpnamtmpnam_s
(C11)
 
定义于头文件 <stdio.h>
char *tmpnam( char *filename );
(1)
errno_t tmpnam_s(char *filename_s, rsize_t maxsize);
(2) (since C11)
#define TMP_MAX        /*unspecified*/
#define TMP_MAX_S      /*unspecified*/
(since C11)
#define L_tmpnam       /*unspecified*/
#define L_tmpnam_s     /*unspecified*/
(since 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 可用。

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 系统还额外定义了名称相似的函数 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 函数

[编辑] 参见

返回指向临时文件的指针
(function) [编辑]
C++ 文档 关于 tmpnam