命名空间
变体
操作

tmpfile, tmpfile_s

来自 cppreference.com
< c‎ | io
 
 
文件输入/输出
类型和对象
函数
文件访问
直接输入/输出
无格式输入/输出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)
格式化输入
(C99)(C99)(C99)(C11)(C11)(C11)     
 
定义在头文件 <stdio.h>
FILE* tmpfile( void );
(1)
errno_t tmpfile_s( FILE* restrict* restrict streamptr );
(2) (since C11)
1) 创建并打开一个临时文件。该文件以二进制文件方式打开以供更新(如同使用 fopen"wb+" 模式)。文件的名称保证在文件系统中是唯一的。在程序的生命周期中,至少可以打开 TMP_MAX 个文件(此限制可能与 tmpnam 共享,并且可能进一步受 FOPEN_MAX 限制)。
2)(1) 相同,只是可以打开至少 TMP_MAX_S 个文件(限制可能与 tmpnam_s 共享),并且如果 streamptr 是一个空指针,则会调用当前已安装的 约束处理程序 函数。
与所有边界检查函数一样,tmpfile_s 仅在实现定义了 __STDC_LIB_EXT1__ 并且用户在包含 <stdio.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整型常量 1 时才保证可用。

由该函数创建的临时文件在程序正常退出时将被关闭并删除。是否在异常终止时删除由实现定义。

内容

[编辑] 参数

1) (无)
2) 指向指针,该指针将由此函数调用更新

[编辑] 返回值

1) 指向与文件关联的文件流的指针,如果发生错误,则为 null 指针。
2) 如果文件创建并成功打开,则为 0;如果文件未创建或打开,或如果 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: 待定)
  • K.3.5.1.1 tmpfile_s 函数 (p: 待定)
  • C17 标准 (ISO/IEC 9899:2018)
  • 7.21.4.3 tmpfile 函数 (p: 222)
  • K.3.5.1.1 tmpfile_s 函数 (p: 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 函数 (p: 269)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 4.9.4.3 tmpfile 函数

[编辑] 另请参阅

返回一个唯一的文件名
(函数) [编辑]
C++ 文档 for tmpfile