_mktemp_s
, _wmktemp_s
Crea un nome di file univoco. Queste funzioni sono versioni di , _wmktemp
con miglioramenti della_mktemp
sicurezza, come descritto in Funzionalità di sicurezza in CRT.
Sintassi
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
Parametri
nameTemplate
Modello di nome di file.
sizeInChars
La dimensione del buffer in caratteri a byte singolo in _mktemp_s
o in caratteri wide in _wmktemp_s
, incluso il carattere di terminazione Null.
Valore restituito
Entrambe queste funzioni restituiscono zero in caso di esito positivo e un codice di errore in caso di esito negativo.
Condizioni di errore
nameTemplate |
sizeInChars |
Valore restituito | Nuovo valore in nameTemplate |
---|---|---|---|
NULL |
qualsiasi | EINVAL |
NULL |
Formato non corretto (vedere la sezione Osservazioni per il formato corretto) | qualsiasi | EINVAL |
stringa vuota |
qualsiasi | <= numero di caratteri X | EINVAL |
stringa vuota |
Se si verifica una delle condizioni di errore precedenti, viene richiamato il gestore di parametri non validi, come descritto in Convalida dei parametri. Se l'esecuzione può continuare, errno
viene impostato su EINVAL
e le funzioni restituiscono EINVAL
.
Osservazioni:
La funzione _mktemp_s
crea un nome file univoco modificando l'argomento nameTemplate
, in modo che, dopo la chiamata, il puntatore nameTemplate
punti a una stringa contenente il nuovo nome del file. _mktemp_s
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_s
è una versione a caratteri wide di _mktemp_s
. L'argomento di _wmktemp_s
è una stringa di caratteri wide. _wmktemp_s
e _mktemp_s
si comportano in modo identico, ad eccezione del fatto che _wmktemp_s
non gestisce stringhe di caratteri multibyte.
Le versioni della libreria di debug di queste funzioni riempiono prima di tutto il buffer con 0xFE. Per disabilitare questo comportamento, usare _CrtSetDebugFillThreshold
.
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_s |
_mktemp_s |
_mktemp_s |
_wmktemp_s |
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_s
. Ogni carattere del segnaposto in nameTemplate
deve essere una X maiuscola. _mktemp_s
mantiene base
e sostituisce la prima X finale con un carattere alfabetico. _mktemp_s
sostituisce i caratteri X che seguono con un valore di cinque cifre. Questo valore è un numero univoco che identifica il processo chiamante o nei programmi multithreading, il thread chiamante.
Ogni chiamata riuscita a _mktemp_s
modifica nameTemplate
. In ogni chiamata successiva dallo stesso processo o thread con lo stesso argomento nameTemplate
, _mktemp_s
controlla se sono presenti nomi di file corrispondenti ai nomi restituiti da _mktemp_s
nelle chiamate precedenti. Se non esiste alcun file per un determinato nome, _mktemp_s
restituisce tale nome. Se sono presenti file per tutti i nomi restituiti in precedenza, _mktemp_s
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_s
è 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_s
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_s
può creare per i valori base
e nameTemplate
usati in questo esempio.
In C++ l'utilizzo di queste funzioni è semplificato dagli overload dei modelli. Gli overload possono dedurre la lunghezza del buffer automaticamente (eliminando la necessità di specificare un argomento di dimensione) e possono sostituire automaticamente le funzioni precedenti e non sicure con le controparti più recenti e sicure. Per altre informazioni, vedere Proteggere gli overload dei modelli.
Requisiti
Ciclo | Intestazione obbligatoria |
---|---|
_mktemp_s |
<io.h> |
_wmktemp_s |
<io.h> o <wchar.h> |
Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).
Esempio
// 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;
}
Output di esempio
Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188
Vedi anche
Gestione dei file
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
, _wtempnam
, tmpnam
_wtmpnam
tmpfile_s