_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_s
vč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