Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Создает уникальное имя файла. Эти функции — это версии с улучшениями безопасности, _wmktempкак описано в функциях безопасности в CRT._mktemp
Синтаксис
errno_t _mktemp_s(
char *nameTemplate,
size_t sizeInChars
);
errno_t _wmktemp_s(
wchar_t *nameTemplate,
size_t sizeInChars
);
template <size_t size>
errno_t _mktemp_s(
char (&nameTemplate)[size]
); // C++ only
template <size_t size>
errno_t _wmktemp_s(
wchar_t (&nameTemplate)[size]
); // C++ only
Параметры
nameTemplate
Шаблон имени файла.
sizeInChars
Размер буфера в однобайтовых символах в _mktemp_s, в расширенных символах в _wmktemp_s, включая знак завершения NULL.
Возвращаемое значение
Обе этих функции возвращают нулевое значение в случае успешного выполнения; код ошибки — в случае сбоя.
Условия ошибок
nameTemplate |
sizeInChars |
Возвращаемое значение | Новое значение в nameTemplate |
|---|---|---|---|
NULL |
любое | EINVAL |
NULL |
| Неправильный формат (см. раздел "Примечания" для правильного формата) | любое | EINVAL |
пустая строка |
| любое | <= число символов X | EINVAL |
пустая строка |
Если возникает какая-либо из указанных выше ошибок, вызывается обработчик недопустимых параметров, как описано в разделе "Проверка параметров". Если выполнение может быть продолжено, для параметра errno устанавливается значение EINVAL, и функция возвращает значение EINVAL.
Замечания
Функция _mktemp_s создает уникальное имя файла, изменяя аргумент nameTemplate таким образом, чтобы после вызова указатель nameTemplate ссылался на строку, содержащую имя нового файла. Функция _mktemp_s автоматически требуемым образом обрабатывает аргументы в виде многобайтовых строк, распознавая многобайтовые последовательности символов в соответствии с текущей многобайтовой кодовой страницей, используемой системой времени выполнения. Функция _wmktemp_s — это версия _mktemp_s с расширенными символами; аргумент _wmktemp_s — строка расширенных символов. _wmktemp_s и _mktemp_s ведет себя одинаково в противном случае, за исключением того, что _wmktemp_s не обрабатывает строки многобайтовых символов.
Версии библиотек отладки этих функций сначала заполняют буфер 0xFE. Чтобы отключить это поведение, используйте _CrtSetDebugFillThreshold.
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.
Сопоставления подпрограмм универсального текста
| Подпрограмма Tchar.h | _UNICODE и _MBCS не определен |
_MBCS Определенные |
_UNICODE Определенные |
|---|---|---|---|
_tmktemp_s |
_mktemp_s |
_mktemp_s |
_wmktemp_s |
Аргумент nameTemplate имеет форму baseXXXXXX, где base является частью нового имени файла, который вы указали, а X — это заполнитель для символа, указанного в _mktemp_s. Каждый символ заполнителя в функции nameTemplate должен быть обозначен символом X в верхнем регистре. Функция _mktemp_s сохраняет base и заменяет первый конечный символ X на букву. _mktemp_s заменяет символы X, которые следуют за пятизначным значением. Это уникальное число, определяющее процесс вызова или в многопоточных программах, вызывающий поток.
Каждый успешный вызов функции _mktemp_s изменяет nameTemplate. В каждом последующем вызове из того же процесса или потока с таким же аргументом nameTemplate функция _mktemp_s проверяет имена файлов, совпадающих с именами, которые были возвращены _mktemp_s в предыдущих вызовах. Если файл не существует для указанного имени, функция _mktemp_s возвращает это имя. Если файлы существуют для всех ранее возвращенных имен, функция _mktemp_s создает новое имя, заменяя букву, которая использовалась в ранее возвращенном имени, следующей доступной строчной буквой по порядку от "a" до "z". Например, если base — это
fn
а пятизначное число, предоставляемое _mktemp_s, — 12345, то возвращается имя:
fna12345
Если это имя используется для создания файла FNA12345 и этот файл существует, то следующее имя, возвращаемое из того же процесса или потока с таким же аргументом base для nameTemplate будет
fnb12345
Если FNA12345 не существует, возвращается следующее имя:
fna12345
_mktemp_sможет создавать не более 26 уникальных имен файлов для любого заданного сочетания и nameTemplate значенийbase. Таким образом, FNZ12345 является последним уникальным именем файла, которое может создать функция _mktemp_s для значений base и nameTemplate, используемых в этом примере.
В C++ использование данных функций упрощено наличием шаблонных перегрузок; перегруженные методы могут автоматически определять длину буфера (что исключает необходимость указания аргумента с размером буфера), а также они могут автоматически заменять более старые, незащищенные функции их новыми безопасными аналогами. Дополнительные сведения см. в разделе "Безопасные перегрузки шаблонов".
Требования
| Маршрут | Обязательный заголовок |
|---|---|
_mktemp_s |
<io.h> |
_wmktemp_s |
<io.h> или <wchar.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// crt_mktemp_s.cpp
/* The program uses _mktemp to create
* five unique filenames. It opens each filename
* to ensure that the next name is unique.
*/
#include <io.h>
#include <string.h>
#include <stdio.h>
char *fnTemplate = "fnXXXXXX";
char names[5][9];
int main()
{
int i, err, sizeInChars;
FILE *fp;
for( i = 0; i < 5; i++ )
{
strcpy_s( names[i], sizeof(names[i]), fnTemplate );
/* Get the size of the string and add one for the null terminator.*/
sizeInChars = strnlen(names[i], 9) + 1;
/* Attempt to find a unique filename: */
err = _mktemp_s( names[i], sizeInChars );
if( err != 0 )
printf( "Problem creating the template" );
else
{
if( fopen_s( &fp, names[i], "w" ) == 0 )
printf( "Unique filename is %s\n", names[i] );
else
printf( "Cannot open %s\n", names[i] );
fclose( fp );
}
}
return 0;
}
Пример полученных результатов
Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188
См. также
Обработка файлов
fopen, _wfopen
_getmbcp
_getpid
_open, _wopen
_setmbcp
_tempnam, , _wtempnamtmpnam_wtmpnam
tmpfile_s