_mktemp
, _wmktemp
Crea un nome di file univoco. Sono disponibili versioni più sicure di queste funzioni; vedere _mktemp_s
, _wmktemp_s
.
Sintassi
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
Parametri
nameTemplate
Modello di nome di file.
Valore restituito
Ognuna di queste funzioni restituisce un puntatore al nome modificatoTemplate. La funzione restituisce NULL
se nameTemplate
è in formato non corretto o non è possibile creare altri nomi univoci dal nome specificatoTemplate.
Osservazioni:
La funzione _mktemp
crea un nome di file univoco modificando l'argomento nameTemplate
. _mktemp
gestisce automaticamente e in modo appropriato gli argomenti stringa di caratteri multibyte, riconoscendo le sequenze di caratteri multibyte in base alla tabella codici multibyte in uso nel sistema di runtime. _wmktemp
è una versione a caratteri wide di _mktemp
. L'argomento e il valore restituito di _wmktemp
sono stringhe a caratteri wide. _wmktemp
e _mktemp
si comportano in modo identico, ad eccezione del fatto che _wmktemp
non gestisce stringhe di caratteri multibyte.
Per impostazione predefinita, lo stato globale di questa funzione è limitato all'applicazione. Per modificare questo comportamento, vedere Stato globale in CRT.
Mapping di routine di testo generico
Routine Tchar.h | _UNICODE e _MBCS non definito |
_MBCS definito |
_UNICODE definito |
---|---|---|---|
_tmktemp |
_mktemp |
_mktemp |
_wmktemp |
L'argomento nameTemplate
ha il formato baseXXXXXX
, dove base
è la parte del nome del nuovo file che viene fornito e ogni X è un segnaposto per un carattere fornito da _mktemp
. Ogni carattere del segnaposto in nameTemplate
deve essere una X maiuscola. _mktemp
mantiene base
e sostituisce la prima X finale con un carattere alfabetico. _mktemp
sostituisce i caratteri X finali con un valore a cinque cifre. Questo valore è un numero univoco che identifica il processo chiamante o nei programmi multithreading, il thread chiamante.
Ogni chiamata riuscita a _mktemp
modifica nameTemplate
. In ogni chiamata successiva dallo stesso processo o thread con lo stesso argomento nameTemplate
, _mktemp
controlla se sono presenti nomi di file corrispondenti ai nomi restituiti da _mktemp
nelle chiamate precedenti. Se non esiste alcun file per un determinato nome, _mktemp
restituisce tale nome. Se sono presenti file per tutti i nomi restituiti in precedenza, _mktemp
crea un nuovo nome sostituendo il carattere alfabetico usato nel nome restituito in precedenza con la successiva lettera minuscola disponibile, in ordine dalla 'a' alla 'z'. Ad esempio, se base
è:
fn
e il valore di cinque cifre fornito da _mktemp
è 12345, il primo nome restituito è:
fna12345
Se questo nome viene usato per creare il file FNA12345 e questo file esiste ancora, il successivo nome restituito per una chiamata dallo stesso processo o thread con lo stesso valore base
per nameTemplate
è:
fnb12345
Se FNA12345 non esiste, il nome successivo restituito è di nuovo:
fna12345
_mktemp
può creare un massimo di 26 nomi di file univoci per qualsiasi combinazione di base
valori e nameTemplate
specificati. Pertanto, FNZ12345 è l'ultimo nome di file univoco che _mktemp
può creare per i valori base
e nameTemplate
usati in questo esempio.
In caso di errore viene impostato errno
. Se nameTemplate
ha un formato non valido (ad esempio, meno di sei caratteri X), errno
è impostato su EINVAL
. Se _mktemp
non è possibile creare un nome univoco perché esistono già tutti i 26 nomi di file possibili, _mktemp
imposta nameTemplate su una stringa vuota e restituisce EEXIST
.
In C++ queste funzioni presentano overload di modello che richiamano le relative controparti più recenti e sicure. Per altre informazioni, vedere Proteggere gli overload dei modelli.
Requisiti
Ciclo | Intestazione obbligatoria |
---|---|
_mktemp |
<io.h> |
_wmktemp |
<io.h> o <wchar.h> |
Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).
Esempio
// 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.
Vedi anche
Gestione dei file
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
, _wtempnam
, tmpnam
_wtmpnam
tmpfile