_mktemp_s
, _wmktemp_s
Cria um nome de arquivo exclusivo. Estas funções são versões de _mktemp
, _wmktemp
com aprimoramentos de segurança, conforme descrito em Recursos de segurança no CRT.
Sintaxe
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
Padrão de nome de arquivo.
sizeInChars
Tamanho do buffer em caracteres de byte único no _mktemp_s
, caracteres largos em _wmktemp_s
, incluindo o terminador nulo.
Valor retornado
Ambas as funções retornam zero em caso de êxito, um código de erro em caso de falha.
Condições de erro
nameTemplate |
sizeInChars |
Valor retornado | Novo valor em nameTemplate |
---|---|---|---|
NULL |
any | EINVAL |
NULL |
Formato incorreto (consulte a seção Comentários para o formato correto) | any | EINVAL |
cadeia de caracteres vazia |
any | <= número de X caracteres | EINVAL |
cadeia de caracteres vazia |
Se qualquer uma das condições de erro acima ocorrer, o manipulador de parâmetro inválido será invocado, conforme descrito em Validação de parâmetro. Se a execução tiver permissão para continuar, errno
será definido como EINVAL
e as funções retornarão EINVAL
.
Comentários
A função _mktemp_s
cria um nome de arquivo exclusivo modificando o argumento nameTemplate
, para que depois da chamada o ponteiro nameTemplate
aponte para uma cadeia de caracteres que contém o novo nome de arquivo. _mktemp_s
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_s
é uma versão de caractere largo de _mktemp_s
, o argumento de _wmktemp_s
é uma cadeia de caracteres largos. _wmktemp_s
e _mktemp_s
se comportar de forma idêntica de outra forma, exceto que _wmktemp_s
não lida com cadeias de caracteres multibyte.
As versões de biblioteca de depuração dessas funções preenchem o buffer com 0xFE. Para desabilitar esse comportamento, use _CrtSetDebugFillThreshold
.
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_s |
_mktemp_s |
_mktemp_s |
_wmktemp_s |
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_s
. Cada caractere de espaço reservado em nameTemplate
deve ser um X maiúsculo. _mktemp_s
preserva base
e substitui o primeiro X à direita por um caractere alfabético. _mktemp_s
substitui os caracteres X que se seguem 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_s
modifica nameTemplate
. Em cada chamada subsequente do mesmo processo ou thread com o mesmo argumento nameTemplate
, _mktemp_s
verifica os nomes de arquivos que correspondem aos nomes retornados por _mktemp_s
em chamadas anteriores. Se não existir nenhum arquivo para um determinado nome, _mktemp_s
retornará esse nome. Se existirem arquivos para todos os nomes retornados anteriormente, o _mktemp_s
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_s
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_s
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_s
pode criar para os valores base
e nameTemplate
usados neste exemplo.
Em C++, o uso dessas funções é simplificado pelas sobrecargas de modelo; as sobrecargas podem inferir o tamanho do buffer automaticamente (eliminando a necessidade de especificar um argumento de tamanho) e podem substituir automaticamente funções mais antigas e não seguras por suas equivalentes mais recentes e seguras. Para obter mais informações, consulte Sobrecargas de modelo seguras.
Requisitos
Rotina | Cabeçalho necessário |
---|---|
_mktemp_s |
<io.h> |
_wmktemp_s |
<io.h> ou <wchar.h> |
Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
// 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;
}
Saída de exemplo
Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188
Confira também
Manipulação de arquivos
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
, _wtempnam
, tmpnam
, _wtmpnam
tmpfile_s