Spec-Zone.ru › C

tmpfile, tmpfile_s

Определено в заголовке <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 является указателем на null, то вызывается текущая установленная функция обработчика ограничений обработчика ограничений. Как и во всех функциях с проверкой границ, 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:2023):
    • 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

См. также

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

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

Spec-Zone.ru

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