Namespaces
Variants

tmpnam, tmpnam_s

From cppreference.net
< c ‎ | io
Определено в заголовочном файле <stdio.h>
char * tmpnam ( char * filename ) ;
(1)
errno_t tmpnam_s ( char * filename_s, rsize_t maxsize ) ;
(2) (начиная с C11)
#define TMP_MAX        /*unspecified*/
#define TMP_MAX_S      /*unspecified*/
(начиная с C11)
#define L_tmpnam       /*unspecified*/
#define L_tmpnam_s     /*unspecified*/
(начиная с C11)
1) Создает уникальное корректное имя файла (длиной не более L_tmpnam ) и сохраняет его в строке символов, на которую указывает filename . Функция способна генерировать до TMP_MAX уникальных имен файлов, но некоторые или все из них могут быть уже заняты в файловой системе и поэтому не подходят в качестве возвращаемых значений.
2) Аналогично (1) , за исключением того, что может быть сгенерировано до TMP_MAX_S имён длиной не более L_tmpnam_s , и следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную функцию обработки ограничений :
  • filename_s является нулевым указателем
  • maxsize больше RSIZE_MAX
  • maxsize меньше сгенерированной строки имени файла
Как и все функции с проверкой границ, tmpnam_s гарантированно доступна только если реализация определяет __STDC_LIB_EXT1__ и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <stdio.h> .

tmpnam и tmpnam_s изменяют статическое состояние (которое может быть общим для этих функций) и не обязаны быть потокобезопасными.

Содержание

Параметры

filename - указатель на массив символов, способный содержать как минимум L_tmpnam байт, используемый в качестве результирующего буфера. Если передается нулевой указатель, возвращается указатель на внутренний статический буфер.
filename_s - указатель на массив символов, способный содержать как минимум L_tmpnam_s байт, используемый в качестве результирующего буфера.
maxsize - максимальное количество символов, которое функция может записать (обычно размер массива filename_s ).

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

1) filename если filename не был нулевым указателем. В противном случае возвращается указатель на внутренний статический буфер. Если не удается сгенерировать подходящее имя файла, возвращается нулевой указатель.
2) Возвращает ноль и записывает имя файла в filename_s при успехе. При ошибке возвращает ненулевое значение и записывает нулевой символ в filename_s [ 0 ] (только если filename_s не является нулевым указателем и maxsize не равно нулю и не больше RSIZE_MAX ).

Примечания

Хотя имена, генерируемые функцией tmpnam , сложно предугадать, существует вероятность, что файл с таким именем будет создан другим процессом в промежутке между моментом, когда tmpnam возвращает результат, и моментом, когда программа попытается использовать возвращённое имя для создания файла. Стандартная функция tmpfile и POSIX-функция mkstemp не имеют этой проблемы (создание уникального каталога с использованием только стандартной библиотеки C по-прежнему требует применения tmpnam ).

Системы POSIX дополнительно определяют функцию с похожим названием tempnam , которая предоставляет выбор директории (по умолчанию используется опционально определённый макрос P_tmpdir ).

Пример

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    // Примечание: компилятор/линковщик может выдать предупреждение безопасности, например в GCC:
    // "warning: the use of `tmpnam' is dangerous, better use `mkstemp'"
    char* name1 = tmpnam(NULL);
    printf("temporary file name: %s\n", name1);
    char name2[L_tmpnam];
    if (tmpnam(name2))
        printf("temporary file name: %s\n", name2);
    // POSIX предлагает mkstemp. Следующее объявление может быть
    // необходимо, так как mkstemp отсутствует в стандартном C <stdlib.h>.
    int mkstemp(char*);
    char name3[] = "/tmp/fileXXXXXX"; // требуется как минимум шесть 'X' ^_^
    int file_descriptor = mkstemp(name3);
    if (file_descriptor != -1)
        printf("temporary file name: %s\n", name3);
    else
        perror("mkstemp");
}

Возможный вывод:

temporary file name: /tmp/file90dLlR
temporary file name: /tmp/fileY9LWAg
temporary file name: /tmp/filexgv8PF

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.21.4.4 Функция tmpnam (стр.: TBD)
  • K.3.5.1.2 Функция tmpnam_s (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.21.4.4 Функция tmpnam (стр. 222)
  • K.3.5.1.2 Функция tmpnam_s (стр. 427-428)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.21.4.4 Функция tmpnam (стр. 303-304)
  • K.3.5.1.2 Функция tmpnam_s (стр. 587-588)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.19.4.4 Функция tmpnam (стр. 269-270)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.9.4.4 Функция tmpnam

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

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