_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 EINVAL
hodnotu . 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