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/cpp/io/c/tmpfile

Spec-Zone.ru

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