Поделиться через


_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, , _wtempnamtmpnam_wtmpnam
tmpfile