_mktemp
, _wmktemp
Crea un nombre de archivo único. Hay disponibles versiones más seguras de estas funciones; consulte _mktemp_s
, _wmktemp_s
.
Sintaxis
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
Parámetros
nameTemplate
Patrón de nombre de archivo.
Valor devuelto
Cada una de estas funciones devuelve un puntero al elemento nameTemplate modificado. La función devuelve NULL
si nameTemplate
tiene un formato incorrecto o no se pueden crear más nombres únicos a partir del nombre especificadoTemplate.
Comentarios
La función _mktemp
crea un nombre de archivo único modificando el argumento nameTemplate
. _mktemp
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
es una versión con caracteres anchos de _mktemp
; el argumento y el valor devuelto de _wmktemp
son cadenas de caracteres anchos. _wmktemp
y _mktemp
se comportan de forma idéntica, salvo que _wmktemp
no controla las cadenas de caracteres multibyte.
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 |
_mktemp |
_mktemp |
_wmktemp |
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
. Cada marcador de posición de nameTemplate
debe ser una X mayúscula. _mktemp
conserva base
y reemplaza la primera X final por un carácter alfabético. _mktemp
reemplaza los caracteres X finales 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
modifica nameTemplate
. En cada llamada posterior realizada desde el mismo proceso o subproceso con el mismo argumento nameTemplate
, _mktemp
busca nombres de archivo que coincidan con los nombres devueltos por _mktemp
en las llamadas anteriores. Si no existe ningún archivo para un nombre concreto, _mktemp
devuelve dicho nombre. Si existen archivos de todos los nombres devueltos previamente, _mktemp
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
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
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
puede crear para los valores base
y nameTemplate
usados en este ejemplo.
En caso de error, se establece errno
. Si nameTemplate
tiene un formato no válido (por ejemplo, menos de seis caracteres X), errno
se establece en EINVAL
. Si _mktemp
no puede crear un nombre único porque ya existen los 26 nombres de archivo posibles, _mktemp
establece nameTemplate en una cadena vacía y devuelve EEXIST
.
En C++, estas funciones tienen sobrecargas de plantilla que invocan los homólogos seguros más recientes de estas funciones. Para obtener más información, consulte Sobrecargas de plantilla seguras.
Requisitos
Routine | Encabezado necesario |
---|---|
_mktemp |
<io.h> |
_wmktemp |
<io.h> o <wchar.h> |
Para obtener más información sobre compatibilidad, consulte Compatibilidad.
Ejemplo
// 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.
Consulte también
Control de archivos
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
, _wtempnam
, , tmpnam
, _wtmpnam
tmpfile