tmpfile, tmpfile_s

来自cppreference.com
< 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)上,此函数确实从文件系统上创建、打开并立即删除该文件:只要被删除文件的文件开启描述符为程序所管理,该文件就会存在,但只要它被删除,其名就不会出现于任何目录中,从而再无其他进程能打开它。一旦文件描述符被关闭,或一旦程序终止(正常或异常),该文件所占有的空间将被文件系统回收。

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

[编辑] 示例

#define _POSIX_C_SOURCE 200112L
#include <stdio.h>
#include <stdio.h>
#include <unistd.h>
int main(void)
{
    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特定方法
    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);
}

可能的输出:

got back from the file: 'Hello'
File name: /tmp/tmpfjptPe5 (deleted)

[编辑] 参考

  • C11 standard (ISO/IEC 9899:2011):
  • 7.21.4.3 The tmpfile function (p: 303)
  • K.3.5.1.1 The tmpfile_s function (p: 586-587)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.19.4.3 The tmpfile function (p: 269)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.9.4.3 The tmpfile function

[编辑] 参阅

返回唯一的文件名
(函数) [edit]
tmpfileC++文档