Sdílet prostřednictvím


_mktemp, _wmktemp

Vytvoří jedinečný název souboru. K dispozici jsou bezpečnější verze těchto funkcí; viz _mktemp_s, _wmktemp_s.

Syntaxe

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

Parametry

nameTemplate
Vzor názvu souboru.

Vrácená hodnota

Každá z těchto funkcí vrátí ukazatel na upravený názevTemplate. Funkce vrátí NULL , pokud nameTemplate je špatně vytvořena nebo nelze vytvořit žádné další jedinečné názvy z daného názvuTemplate.

Poznámky

Funkce _mktemp vytvoří jedinečný název souboru úpravou argumentu nameTemplate . _mktemp automaticky zpracovává vícebajtové řetězcové argumenty podle potřeby a rozpoznává vícebajtové sekvence znaků podle vícebajtové znakové stránky, kterou aktuálně používá systém runtime. _wmktemp je verze širokého znaku _mktemp; argument a návratová _wmktemp hodnota jsou řetězce širokých znaků. _wmktemp a _mktemp chovat se stejně jinak, s tím rozdílem, že _wmktemp nezpracovává vícebajtové řetězce.

Ve výchozím nastavení je globální stav této funkce vymezen na aplikaci. Chcete-li toto chování změnit, přečtěte si téma Globální stav v CRT.

Mapování rutin obecného textu

Rutina Tchar.h _UNICODE a _MBCS není definován _MBCS definovaný _UNICODE definovaný
_tmktemp _mktemp _mktemp _wmktemp

Argument nameTemplate má tvar baseXXXXXX, kde base je součástí nového názvu souboru, který zadáte, a každý X je zástupný symbol pro znak zadaný znakem _mktemp. Každý zástupný znak nameTemplate musí být velkým písmenem X. _mktemp Zachová base a nahradí první znak X na konci abecedním znakem. _mktemp nahradí koncové znaky X pětimístnou hodnotou. Tato hodnota je jedinečné číslo, které identifikuje volající proces nebo ve vícevláknových programech volající vlákno.

Každé úspěšné volání _mktemp modifikuje nameTemplate. V každém následném volání ze stejného procesu nebo vlákna se stejným nameTemplate argumentem zkontroluje názvy souborů, _mktemp které odpovídají názvům vráceným _mktemp v předchozích voláních. Pokud pro daný název neexistuje žádný soubor, _mktemp vrátí tento název. Pokud soubory existují pro všechny dříve vrácené názvy, vytvoří nový název tak, _mktemp že nahradí abecední znak použitý v dříve vráceném názvu dalším dostupným malým písmenem v pořadí od "a" do "z". Pokud je to například base :

fn

a pětimístná hodnota zadaná číslem _mktemp 12345, vrátí se jméno:

fna12345

Pokud se tento název používá k vytvoření souboru FNA12345 a tento soubor stále existuje, bude další název vrácený při volání ze stejného procesu nebo vlákna se stejným base názvem pro nameTemplate :

fnb12345

Pokud FNA12345 neexistuje, vrátí se další název:

fna12345

_mktemp může vytvořit maximálně 26 jedinečných base názvů souborů pro libovolnou kombinaci a nameTemplate hodnoty. Proto FNZ12345 je poslední jedinečný název _mktemp souboru může vytvořit pro base hodnoty použité nameTemplate v tomto příkladu.

Při selhání errno je nastaveno. Pokud nameTemplate má neplatný formát (například méně než šest znaků X), errno je nastaven na EINVALhodnotu . Pokud _mktemp nelze vytvořit jedinečný název, protože již existují všechny 26 možných názvů souborů, _mktemp nastaví nameTemplate na prázdný řetězec a vrátí .EEXIST

V jazyce C++ mají tyto funkce přetížení šablon, které vyvolávají novější zabezpečené protějšky těchto funkcí. Další informace naleznete v tématu Přetížení šablon zabezpečení.

Požadavky

Rutina Požadovaný hlavičkový soubor
_mktemp <io.h>
_wmktemp <io.h> nebo <wchar.h>

Další informace o kompatibilitě najdete v tématu Kompatibilita.

Příklad

// 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.

Viz také

Zpracování souborů
fopen, _wfopen
_getmbcp
_getpid
_open, _wopen
_setmbcp
_tempnam, _wtempnam, , tmpnam_wtmpnam
tmpfile