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)"
См. также
| возвращает уникальное имя файла (функция) |
|
|
(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