Share via


_mktemp_s, _wmktemp_s

Crea un nome di file univoco. Queste funzioni sono versioni di , _wmktempcon 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