Namespaces
Variants

tmpfile, tmpfile_s

From cppreference.net
< c ‎ | io
定义于头文件 <stdio.h>
FILE * tmpfile ( void ) ;
(1)
errno_t tmpfile_s ( FILE * restrict * restrict streamptr ) ;
(2) (C11 起)
1) 创建并打开一个临时文件。该文件以二进制更新模式打开(如同使用 fopen 并指定 "wb+" 模式)。该文件的文件名在文件系统中保证是唯一的。在程序生命周期内至少可以打开 TMP_MAX 个文件(此限制可能与 tmpnam 共享,且可能受 FOPEN_MAX 进一步限制)。
2) (1) 相同,区别在于至少可以打开 TMP_MAX_S 个文件(该限制可能与 tmpnam_s 共享),且当 streamptr 为空指针时,将调用当前安装的 约束处理函数
与所有边界检查函数一样,仅当实现定义了 __STDC_LIB_EXT1__ 且用户在包含 <stdio.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整型常量 1 时,才保证 tmpfile_s 可用。

该函数创建的临时文件在程序正常退出时会被关闭并删除。异常终止时是否删除取决于具体实现。

目录

参数

1) (无)
2) 指向将被此函数调用更新的指针的指针

返回值

1) 指向与文件关联的文件流的指针,如果发生错误则为空指针。
2) 若文件成功创建并打开则返回零,若文件未创建或打开,或当 streamptr 为空指针时返回非零值。此外,成功时关联文件流的指针将存入 * streamptr ,错误时则会在 * streamptr 中存入空指针值。

注释

在某些实现中(例如旧版Linux),此函数实际上会创建、打开并立即从文件系统中删除文件:只要程序持有已删除文件的打开文件描述符,该文件就仍然存在,但由于已被删除,其名称不会出现在任何目录中,因此其他进程无法打开它。一旦文件描述符关闭,或程序终止(正常或异常),文件所占用的空间就会被文件系统回收。较新的Linux(3.11或更高版本,具体取决于文件系统)通过 open() 系统调用中的特殊标志,可一步创建此类不可见的临时文件。

在某些实现中(例如 Windows),需要提升权限,因为该函数可能在系统目录中创建临时文件。

示例

#define _POSIX_C_SOURCE 200112L
#include <stdio.h>
#include <unistd.h>
int main(void)
{
    printf("TMP_MAX = %d, FOPEN_MAX = %d\n", TMP_MAX, FOPEN_MAX);
    FILE* tmpf = tmpfile();
    fputs("Hello, world", tmpf);
    rewind(tmpf);
    char buf[6];
    fgets(buf, sizeof buf, tmpf);
    printf("got back from the file: '%s'\n", buf);
    // Linux-specific method to display the tmpfile name
    char fname[FILENAME_MAX], link[FILENAME_MAX] = {0};
    sprintf(fname, "/proc/self/fd/%d", fileno(tmpf));
    if (readlink(fname, link, sizeof link - 1) > 0)
        printf("File name: %s\n", link);
}

可能的输出:

TMP_MAX = 238328, FOPEN_MAX = 16
got back from the file: 'Hello'
File name: /tmp/tmpfjptPe5 (deleted)

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 7.21.4.3 tmpfile 函数 (p: TBD)
  • K.3.5.1.1 tmpfile_s 函数 (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 7.21.4.3 tmpfile 函数 (页: 222)
  • K.3.5.1.1 tmpfile_s 函数 (页: 427)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.21.4.3 tmpfile 函数 (p: 303)
  • K.3.5.1.1 tmpfile_s 函数 (p: 586-587)
  • C99标准(ISO/IEC 9899:1999):
  • 7.19.4.3 tmpfile函数(页码:269)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.9.4.3 tmpfile 函数

参考

返回唯一的文件名
(函数)
C++ 文档 关于 tmpfile