Sdílet prostřednictvím


_mktemp_s, _wmktemp_s

Vytvoří jedinečný název souboru. Tyto funkce jsou verze _mktemp, _wmktemp s vylepšeními zabezpečení, jak je popsáno v funkcích zabezpečení v CRT.

Syntaxe

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

Parametry

nameTemplate
Vzor názvu souboru.

sizeInChars
Velikost vyrovnávací paměti v jednobajtů znaků v _mktemp_s; široké znaky , _wmktemp_svčetně ukončovací funkce null.

Vrácená hodnota

Obě tyto funkce vrací nulu při úspěchu; kód chyby při selhání.

Chybové podmínky

nameTemplate sizeInChars Vrácená hodnota Nová hodnota v nameTemplate
NULL jakékoliv EINVAL NULL
Nesprávný formát (viz oddíl Poznámky pro správný formát) jakékoliv EINVAL prázdný řetězec
jakékoliv <= počet znaků X EINVAL prázdný řetězec

Pokud dojde k některé z výše uvedených chybových podmínek, vyvolá se neplatná obslužná rutina parametru, jak je popsáno v ověření parametru. Pokud je povoleno pokračovat provádění, errno je nastavena na EINVAL a funkce vrátí EINVAL.

Poznámky

Funkce _mktemp_s vytvoří jedinečný název souboru úpravou argumentu nameTemplate , takže po volání ukazatel odkazuje na řetězec obsahující nameTemplate nový název souboru. _mktemp_s 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_s je verze širokého znaku _mktemp_s; argument je řetězec širokého _wmktemp_s znaku. _wmktemp_s a _mktemp_s chovat se stejně jinak, s tím rozdílem, že _wmktemp_s nezpracovává vícebajtové řetězce.

Verze knihovny ladění těchto funkcí nejprve vyplní vyrovnávací paměť 0xFE. Chcete-li toto chování zakázat, použijte _CrtSetDebugFillThreshold.

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_s _mktemp_s _mktemp_s _wmktemp_s

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_s. Každý zástupný znak nameTemplate musí být velkým písmenem X. _mktemp_s Zachová base a nahradí první znak X na konci abecedním znakem. _mktemp_s nahradí znaky X, které následují, 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_s 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_s které odpovídají názvům vráceným _mktemp_s v předchozích voláních. Pokud pro daný název neexistuje žádný soubor, _mktemp_s vrátí tento název. Pokud soubory existují pro všechny dříve vrácené názvy, vytvoří nový název tak, _mktemp_s ž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_s 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_s 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_s souboru může vytvořit pro base hodnoty použité nameTemplate v tomto příkladu.

V jazyce C++ je použití těchto funkcí zjednodušeno přetíženími šablon; přetížení mohou automaticky odvodit délku vyrovnávací paměti (eliminuje potřebu zadat argument velikosti) a mohou automaticky nahradit starší, nezabezpečené funkce jejich novějšími zabezpečenými protějšky. Další informace naleznete v tématu Přetížení šablon zabezpečení.

Požadavky

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

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

Příklad

// 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;
}

Ukázkový výstup

Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188

Viz také

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