Namespaces
Variants

tmpfile, tmpfile_s

From cppreference.net
< c ‎ | io
Определено в заголовке <stdio.h>
FILE * tmpfile ( void ) ;
(1)
errno_t tmpfile_s ( FILE * restrict * restrict streamptr ) ;
(2) (начиная с C11)
1) Создает и открывает временный файл. Файл открывается как бинарный для обновления (как если бы с помощью fopen с режимом "wb+" ). Имя файла гарантированно уникально в файловой системе. Как минимум TMP_MAX файлов может быть открыто в течение времени жизни программы (этот лимит может быть общим с tmpnam и может быть дополнительно ограничен FOPEN_MAX ).
2) То же, что и (1) , за исключением того, что может быть открыто не менее TMP_MAX_S файлов (лимит может быть общим с tmpnam_s ), и если streamptr является нулевым указателем, вызывается установленная в данный момент функция обработки ограничений .
Как и все функции с проверкой границ, tmpfile_s гарантированно доступна только если реализация определяет __STDC_LIB_EXT1__ и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <stdio.h> .

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

Содержание

Параметры

1) (нет)
2) указатель на указатель, который будет обновлен этим вызовом функции

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

1) Указатель на файловый поток, связанный с файлом, или нулевой указатель, если произошла ошибка.
2) Ноль, если файл был успешно создан и открыт; ненулевое значение, если файл не был создан или открыт, или если 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 (стр.: TBD)
  • K.3.5.1.1 Функция tmpfile_s (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.21.4.3 Функция tmpfile (стр: 222)
  • K.3.5.1.1 Функция tmpfile_s (стр: 427)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.21.4.3 Функция tmpfile (стр. 303)
  • K.3.5.1.1 Функция tmpfile_s (стр. 586-587)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.19.4.3 Функция tmpfile (стр. 269)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.9.4.3 Функция tmpfile

Смотрите также

возвращает уникальное имя файла
(функция)
C++ documentation для tmpfile