命名空间
变体
操作

std::tmpfile

来自 cppreference.com
< cpp‎ | io‎ | c
 
 
 
 
定义在头文件 <cstdio>
std::FILE* tmpfile();

创建一个具有唯一自动生成的名称的临时文件并打开它。

文件以更新二进制文件的形式打开(如 std::fopen 使用访问模式 "wb+")。在程序的生命周期中,至少可以打开 TMP_MAX 个文件(此限制可能与 std::tmpnam 共享,并且可能进一步受到 FOPEN_MAX 的限制)。

如果程序关闭了文件,例如通过执行 std::fclose,则该文件将自动删除。

如果程序正常终止(通过调用 std::exit,从 main 返回等),则所有通过调用 std::tmpfile 打开的文件也将自动删除。

如果程序异常终止,则这些临时文件是否会被删除是实现定义的。

内容

[编辑] 参数

(无)

[编辑] 返回值

关联的文件流,如果出现错误则为 NULL 指针。

[编辑] 注释

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

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

[编辑] 示例

#include <cstdio>
#include <cstdlib>
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
 
int main()
{
    std::cout << "TMP_MAX = " << TMP_MAX << '\n'
              << "FOPEN_MAX = " << FOPEN_MAX << '\n';
    std::FILE* tmpf = std::tmpfile();
    std::fputs("Hello, world", tmpf);
    std::rewind(tmpf);
    char buf[6];
    std::fgets(buf, sizeof buf, tmpf);
    std::cout << buf << '\n';
 
    // Linux-specific method to display the tmpfile name
    std::cout << fs::read_symlink(
                     fs::path("/proc/self/fd") / std::to_string(fileno(tmpf))
                 ) << '\n';
}

可能的输出

TMP_MAX = 238328
FOPEN_MAX = 16
Hello
"/tmp/tmpfBlY1lI (deleted)"

[编辑] 另请参阅

返回一个唯一的文件名
(函数) [编辑]
返回适合临时文件的目录
(函数) [编辑]
C 文档 for tmpfile