_mktemp_s
, _wmktemp_s
Crea un nombre de archivo único. Estas funciones son versiones de _mktemp
, _wmktemp
con mejoras de seguridad, como se describe en Características de seguridad de CRT.
Sintaxis
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
Parámetros
nameTemplate
Patrón de nombre de archivo.
sizeInChars
Tamaño del búfer en caracteres de byte único en _mktemp_s
; caracteres anchos en _wmktemp_s
, incluido el terminador nulo.
Valor devuelto
Ambas funciones devuelven cero si se realizan correctamente o un código de error en caso de error.
Condiciones del error
nameTemplate |
sizeInChars |
Valor devuelto | Nuevo valor en nameTemplate |
---|---|---|---|
NULL |
cualquiera | EINVAL |
NULL |
Formato incorrecto (consulte la sección Comentarios para ver el formato correcto) | cualquiera | EINVAL |
cadena vacía |
cualquiera | <= número de caracteres X | EINVAL |
cadena vacía |
Si se produce alguna de las condiciones de error anteriores, se invoca al controlador de parámetros no válidos, como se describe en Validación de parámetros. Si la ejecución puede continuar, errno
se establece en EINVAL
y la función devuelve EINVAL
.
Comentarios
La función _mktemp_s
crea un nombre de archivo único modificando el argumento nameTemplate
. Así, después de la llamada, el puntero nameTemplate
apunta a una cadena que contiene el nuevo nombre de archivo. _mktemp_s
controla automáticamente los argumentos de cadenas de caracteres multibyte según corresponda, reconociendo las secuencias de caracteres multibyte según la página de códigos multibyte que usa actualmente el sistema en tiempo de ejecución. _wmktemp_s
es una versión con caracteres anchos de _mktemp_s
; el argumento de _wmktemp_s
es una cadena de caracteres anchos. _wmktemp_s
y _mktemp_s
se comportan de forma idéntica, salvo que _wmktemp_s
no controla las cadenas de caracteres multibyte.
Las versiones de la biblioteca de depuración de estas funciones rellenan primero el búfer con 0xFE. Para deshabilitar este comportamiento, use _CrtSetDebugFillThreshold
.
De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.
Asignaciones de rutinas de texto genérico
Rutina Tchar.h | _UNICODE y _MBCS no definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_tmktemp_s |
_mktemp_s |
_mktemp_s |
_wmktemp_s |
El argumento nameTemplate
tiene el formato baseXXXXXX
, donde base
es la parte del nuevo nombre de archivo proporcionado y cada X es un marcador de posición de un carácter proporcionado por _mktemp_s
. Cada marcador de posición de nameTemplate
debe ser una X mayúscula. _mktemp_s
conserva base
y reemplaza la primera X final por un carácter alfabético. _mktemp_s
reemplaza los caracteres X que siguen por un valor de cinco dígitos. Este valor es un número único que identifica el proceso de llamada o en programas multiproceso, el subproceso que realiza la llamada.
Cada llamada correcta a _mktemp_s
modifica nameTemplate
. En cada llamada posterior realizada desde el mismo proceso o subproceso con el mismo argumento nameTemplate
, _mktemp_s
busca nombres de archivo que coincidan con los nombres devueltos por _mktemp_s
en las llamadas anteriores. Si no existe ningún archivo para un nombre concreto, _mktemp_s
devuelve dicho nombre. Si existen archivos de todos los nombres devueltos previamente, _mktemp_s
crea un nombre nuevo sustituyendo el carácter alfabético que emplea en el nombre devuelto anteriormente por la siguiente letra minúscula disponible (en orden, de la «a» a la «z»). Por ejemplo, si base
es:
fn
y el valor de cinco dígitos proporcionado por _mktemp_s
es 12345, el primer nombre devuelto es:
fna12345
Si este nombre se usa para crear el archivo FNA12345 y el archivo todavía existe, el siguiente nombre devuelto en una llamada desde el mismo proceso o subproceso con el mismo base
para nameTemplate
es:
fnb12345
Si no existe FNA12345, el nombre siguiente devuelto es de nuevo:
fna12345
_mktemp_s
puede crear un máximo de 26 nombres de archivo únicos para cualquier combinación determinada de base
valores y nameTemplate
. Por lo tanto, FNZ12345 es el último nombre de archivo único que _mktemp_s
puede crear para los valores base
y nameTemplate
usados en este ejemplo.
En C++, el uso de estas funciones se simplifica con las sobrecargas de plantilla; las sobrecargas pueden realizar una inferencia automáticamente de la longitud de búfer (lo que elimina el requisito de especificar un argumento de tamaño) y pueden reemplazar automáticamente funciones anteriores no seguras con sus homólogos seguros más recientes. Para obtener más información, consulte Sobrecargas de plantilla seguras.
Requisitos
Routine | Encabezado necesario |
---|---|
_mktemp_s |
<io.h> |
_wmktemp_s |
<io.h> o <wchar.h> |
Para obtener más información sobre compatibilidad, consulte Compatibilidad.
Ejemplo
// 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;
}
Salida de ejemplo
Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188
Consulte también
Control de archivos
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
, _wtempnam
, , tmpnam
, _wtmpnam
tmpfile_s