Spec-Zone.ru › C++

std::tmpfile

Определено в заголовке <cstdio>
std::FILE* tmpfile();

Создаёт и открывает временный файл с уникальным автоматически сгенерированным именем.

Файл открывается как двоичный файл для обновления (как при std::fopen с режимом доступа "wb+"). За время существования программы может быть открыто как минимум TMP_MAX файла (этот лимит может быть общим с std::tmpnam и может быть ещё ограничен FOPEN_MAX).

Если программа закрывает файл, например, выполнив std::fclose, файл автоматически удаляется.

Если программа завершается нормально (вызванная std::exit, возвращением из main, и т. д.), все файлы, которые были открыты вызовом std::tmpfile, также автоматически удаляются.

Если программа завершается аномально, определяется реализацией, будут ли эти временные файлы удалены.

Параметры

(нет)

Возвращаемое значение

Связанный поток файла или нулевой указатель, если произошла ошибка.

Примечания

В некоторых реализациях (например, в более старых 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)"

См. также

tmpnam
возвращает уникальное имя файла
(функция)
temp_directory_path
(C++17)
возвращает каталог, подходящий для временных файлов
(функция)
C документация для tmpfile

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/c/tmpfile

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API