tmpnam, tmpnam_s
Определено в заголовке <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) |
L_tmpnam символов) и сохраняет его в строке символов, на которую указывает filename. Функция способна сгенерировать до TMP_MAX уникальных имён файлов, но некоторые или все из них могут быть заняты в файловой системе и, следовательно, не подходят в качестве возвращаемых значений.TMP_MAX_S имён, длиной не более L_tmpnam_s символов, и следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную функцию обработчика ограничений: -
-
filename_sявляется указателем на null -
maxsizeбольшеRSIZE_MAX -
maxsizeменьше, чем сгенерированная строка имени файла
-
- Как и во всех функциях с проверкой границ,
tmpnam_sгарантированно доступна только в том случае, если__STDC_LIB_EXT1__определена реализацией и если пользователь определяет__STDC_WANT_LIB_EXT1__как целую константу1перед включением<stdio.h>.
tmpnam и tmpnam_s изменяют статическое состояние (которое может быть разделено между этими функциями) и не обязаны быть потокобезопасными.
Параметры
| filename | - | указатель на массив символов, способный содержать как минимум L_tmpnam байта, используемый в качестве буфера результатов. Если передан null-указатель, возвращается указатель на внутренний статический буфер. |
| filename_s | - | указатель на массив символов, способный содержать как минимум L_tmpnam_s байта, используемый в качестве буфера результатов. |
| maxsize | - | максимальное количество символов, которое функция разрешается записать (обычно размер массива filename_s). |
Возвращаемое значение
filename если filename не был указателем на null. В противном случае возвращается указатель на внутренний статический буфер. Если подходящее имя файла сгенерировать не удаётся, возвращается null-указатель.filename_s при успешном выполнении. При ошибке возвращает ненулевое значение и записывает нулевой символ в filename_s[0] (только если filename_s не равен null и 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)
{
// Note, the compiler/linker may issue a security warning, e.g. 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 offers mkstemp. The following declaration might be
// necessary as mkstemp is absent in the standard C <stdlib.h>.
int mkstemp(char*);
char name3[] = "/tmp/fileXXXXXX"; // at least six 'X' required ^_^
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:2023):
- 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
См. также
|
(C11) | возвращает указатель на временный файл (функция) |
Документация C++ для tmpnam |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/io/tmpnam