_mktemp
, _wmktemp
Создает уникальное имя файла. Доступны более безопасные версии этих функций; see _mktemp_s
, _wmktemp_s
.
Синтаксис
char *_mktemp(
char *nameTemplate
);
wchar_t *_wmktemp(
wchar_t *nameTemplate
);
template <size_t size>
char *_mktemp(
char (&nameTemplate)[size]
); // C++ only
template <size_t size>
wchar_t *_wmktemp(
wchar_t (&nameTemplate)[size]
); // C++ only
Параметры
nameTemplate
Шаблон имени файла.
Возвращаемое значение
Каждая из этих функций возвращает указатель на измененное имяTemplate. Функция возвращается NULL
, если nameTemplate
неправильно сформированы или больше уникальных имен можно создать из заданного имениTemplate.
Замечания
Функция _mktemp
создает уникальное имя файла, изменяя аргумент nameTemplate
. Функция _mktemp
автоматически требуемым образом обрабатывает аргументы в виде многобайтовых строк, распознавая многобайтовые последовательности символов в соответствии с текущей многобайтовой кодовой страницей, используемой системой времени выполнения. _wmktemp
— это версия с расширенными символами для _mktemp
; аргумент и возвращаемое значение _wmktemp
являются строками с расширенными символами. _wmktemp
и _mktemp
ведет себя одинаково в противном случае, за исключением того, что _wmktemp
не обрабатывает строки многобайтовых символов.
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.
Сопоставления подпрограмм универсального текста
Подпрограмма Tchar.h | _UNICODE и _MBCS не определен |
_MBCS Определенные |
_UNICODE Определенные |
---|---|---|---|
_tmktemp |
_mktemp |
_mktemp |
_wmktemp |
Аргумент nameTemplate
имеет форму baseXXXXXX
, где base
является частью нового имени файла, который вы указали, а X — это заполнитель для символа, указанного в _mktemp
. Каждый символ заполнителя в функции nameTemplate
должен быть обозначен символом X в верхнем регистре. Функция _mktemp
сохраняет base
и заменяет первый конечный символ X на букву. _mktemp
заменяет конечные символы X пятью цифрами. Это уникальное число, определяющее процесс вызова или в многопоточных программах, вызывающий поток.
Каждый успешный вызов функции _mktemp
изменяет nameTemplate
. В каждом последующем вызове из того же процесса или потока с таким же аргументом nameTemplate
функция _mktemp
проверяет имена файлов, совпадающих с именами, которые были возвращены _mktemp
в предыдущих вызовах. Если файл не существует для указанного имени, функция _mktemp
возвращает это имя. Если файлы существуют для всех ранее возвращенных имен, функция _mktemp
создает новое имя, заменяя букву, которая использовалась в ранее возвращенном имени, следующей доступной строчной буквой по порядку от "a" до "z". Например, если base
— это
fn
а пятизначное число, предоставляемое _mktemp
, — 12345, то возвращается имя:
fna12345
Если это имя используется для создания файла FNA12345 и этот файл существует, то следующее имя, возвращаемое из того же процесса или потока с таким же аргументом base
для nameTemplate
будет
fnb12345
Если FNA12345 не существует, возвращается следующее имя:
fna12345
_mktemp
может создавать не более 26 уникальных имен файлов для любого заданного сочетания и nameTemplate
значенийbase
. Таким образом, FNZ12345 является последним уникальным именем файла, которое может создать функция _mktemp
для значений base
и nameTemplate
, используемых в этом примере.
В случае сбоя задается значение errno
. Если nameTemplate
имеет недопустимый формат (например, менее шести символов X), errno
устанавливается значение EINVAL
. Если _mktemp
не удается создать уникальное имя, так как все 26 возможных имен файлов уже существуют, _mktemp
задайте имяTemplate пустой строке и возвращает.EEXIST
В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые и безопасные аналоги этих функций. Дополнительные сведения см. в разделе "Безопасные перегрузки шаблонов".
Требования
Маршрут | Обязательный заголовок |
---|---|
_mktemp |
<io.h> |
_wmktemp |
<io.h> или <wchar.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// crt_mktemp.c
// compile with: /W3
/* The program uses _mktemp to create
* unique filenames. It opens each filename
* to ensure that the next name is unique.
*/
#include <io.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
char *template = "fnXXXXXX";
char *result;
char names[27][9];
int main( void )
{
int i;
FILE *fp;
for( i = 0; i < 27; i++ )
{
strcpy_s( names[i], sizeof( names[i] ), template );
/* Attempt to find a unique filename: */
result = _mktemp( names[i] ); // C4996
// Note: _mktemp is deprecated; consider using _mktemp_s instead
if( result == NULL )
{
printf( "Problem creating the template\n" );
if (errno == EINVAL)
{
printf( "Bad parameter\n");
}
else if (errno == EEXIST)
{
printf( "Out of unique filenames\n");
}
}
else
{
fopen_s( &fp, result, "w" );
if( fp != NULL )
printf( "Unique filename is %s\n", result );
else
printf( "Cannot open %s\n", result );
fclose( fp );
}
}
}
Unique filename is fna03912
Unique filename is fnb03912
Unique filename is fnc03912
Unique filename is fnd03912
Unique filename is fne03912
Unique filename is fnf03912
Unique filename is fng03912
Unique filename is fnh03912
Unique filename is fni03912
Unique filename is fnj03912
Unique filename is fnk03912
Unique filename is fnl03912
Unique filename is fnm03912
Unique filename is fnn03912
Unique filename is fno03912
Unique filename is fnp03912
Unique filename is fnq03912
Unique filename is fnr03912
Unique filename is fns03912
Unique filename is fnt03912
Unique filename is fnu03912
Unique filename is fnv03912
Unique filename is fnw03912
Unique filename is fnx03912
Unique filename is fny03912
Unique filename is fnz03912
Problem creating the template.
Out of unique filenames.
См. также
Обработка файлов
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
, , _wtempnam
tmpnam
_wtmpnam
tmpfile