_mktemp
, _wmktemp
Cria um nome de arquivo exclusivo. Versões mais seguras dessas funções estão disponíveis; confira _mktemp_s
, _wmktemp_s
.
Sintaxe
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
Padrão de nome de arquivo.
Valor retornado
Cada uma dessas funções retorna um ponteiro para o nameTemplate modificado. A função retorna NULL
se nameTemplate
estiver mal formada ou se não for possível criar mais nomes exclusivos a partir do nameTemplate fornecido.
Comentários
A função _mktemp
cria um nome de arquivo exclusivo modificando o argumento nameTemplate
. _mktemp
manipula automaticamente argumentos de cadeia de caracteres multibyte conforme apropriado, reconhecendo sequências de caracteres multibyte de acordo com a página de código multibyte que está sendo usada no momento pelo sistema de tempo de execução. _wmktemp
é uma versão de caractere largo de _mktemp
; o argumento e o valor retornado de _wmktemp
são cadeias de caracteres largos. _wmktemp
e _mktemp
se comportar de forma idêntica de outra forma, exceto que _wmktemp
não lida com cadeias de caracteres multibyte.
Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.
Mapeamentos de rotina de texto genérico
Rotina Tchar.h | _UNICODE e _MBCS não definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_tmktemp |
_mktemp |
_mktemp |
_wmktemp |
O argumento nameTemplate
tem o formato baseXXXXXX
, em que base
é a parte do novo nome de arquivo que você fornece e cada X é um espaço reservado para um caractere fornecido pelo _mktemp
. Cada caractere de espaço reservado em nameTemplate
deve ser um X maiúsculo. _mktemp
preserva base
e substitui o primeiro X à direita por um caractere alfabético. _mktemp
substitui os caracteres X à direita por um valor de cinco dígitos. Esse valor é um número exclusivo que identifica o processo de chamada ou, em programas multithread, o thread de chamada.
Cada chamada bem-sucedida para _mktemp
modifica nameTemplate
. Em cada chamada subsequente do mesmo processo ou thread com o mesmo argumento nameTemplate
, _mktemp
verifica os nomes de arquivos que correspondem aos nomes retornados por _mktemp
em chamadas anteriores. Se não existir nenhum arquivo para um determinado nome, _mktemp
retornará esse nome. Se existirem arquivos para todos os nomes retornados anteriormente, o _mktemp
criará um novo nome substituindo o caractere alfabético que ele usou no nome retornado anteriormente pela próxima letra em minúscula disponível, em ordem, de 'a' a 'z'. Por exemplo, se base
for:
fn
e o valor de cinco dígitos fornecido pelo _mktemp
for 12345, o primeiro nome retornado será:
fna12345
Se esse nome for usado para criar o arquivo FNA12345 e esse nome de arquivo já existir, o próximo nome retornado em uma chamada do mesmo processo ou thread com o mesmo base
para nameTemplate
será:
fnb12345
Se FNA12345 não existir, o próximo nome retornado será novamente:
fna12345
_mktemp
pode criar um máximo de 26 nomes de arquivo exclusivos para qualquer combinação de base
e nameTemplate
valores. Portanto, FNZ12345 é o último nome de arquivo exclusivo que _mktemp
pode criar para os valores base
e nameTemplate
usados neste exemplo.
Em caso de falha, errno
é definido. Se nameTemplate
tiver um formato inválido (por exemplo, menos de seis caracteres X), errno
é definido como EINVAL
. Se _mktemp
não for possível criar um nome exclusivo porque todos os 26 nomes de arquivo possíveis já existem, _mktemp
define nameTemplate como uma string vazia e retorna EEXIST
.
No C++, essas funções têm sobrecargas de modelo que invocam os equivalentes mais novos e seguros dessas funções. Para obter mais informações, consulte Sobrecargas de modelo seguras.
Requisitos
Rotina | Cabeçalho necessário |
---|---|
_mktemp |
<io.h> |
_wmktemp |
<io.h> ou <wchar.h> |
Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
// 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.
Confira também
Manipulação de arquivos
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
, _wtempnam
, tmpnam
, _wtmpnam
tmpfile