_mktemp
, _wmktemp
Tworzy unikatową nazwę pliku. Dostępne są bezpieczniejsze wersje tych funkcji; zobacz _mktemp_s
, _wmktemp_s
.
Składnia
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
Parametry
nameTemplate
Wzorzec nazwy pliku.
Wartość zwracana
Każda z tych funkcji zwraca wskaźnik do zmodyfikowanej nazwyTemplate. Funkcja zwraca NULL
wartość , jeśli nameTemplate
jest źle sformułowana lub nie można utworzyć więcej unikatowych nazw na podstawie podanej nazwyTemplate.
Uwagi
Funkcja _mktemp
tworzy unikatową nazwę pliku, modyfikując nameTemplate
argument. _mktemp
automatycznie obsługuje odpowiednio argumenty ciągu wielobajtowego, rozpoznając sekwencje znaków wielobajtowych zgodnie ze stroną kodową wielobajtową używaną obecnie przez system czasu wykonywania. _wmktemp
jest wersją szerokoznakową ; _mktemp
argument i wartość zwracana _wmktemp
są ciągami o szerokim znaku. _wmktemp
i _mktemp
zachowują się identycznie inaczej, z tą różnicą, że _wmktemp
nie obsługuje ciągów wielobajtowych znaków.
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Mapowania procedur tekstu ogólnego
Procedura tchar.h | _UNICODE i _MBCS niezdefiniowane |
_MBCS zdefiniowany |
_UNICODE zdefiniowany |
---|---|---|---|
_tmktemp |
_mktemp |
_mktemp |
_wmktemp |
Argument nameTemplate
ma postać baseXXXXXX
, gdzie base
jest częścią podanej nazwy nowego pliku, a każdy X jest symbolem zastępczym znaku dostarczonego przez _mktemp
element . Każdy symbol zastępczy w nameTemplate
elemencie musi być wielkimi literami X. _mktemp
zachowuje base
i zastępuje pierwszy końcowy znak X znakiem alfabetycznym. _mktemp
Zastępuje końcowe znaki X pięciocyfrową wartością. Ta wartość jest unikatową liczbą identyfikującą proces wywołujący lub w programach wielowątkowych wywołujący wątek.
Każde pomyślne wywołanie modyfikuje metodę _mktemp
nameTemplate
. W każdym kolejnym wywołaniu z tego samego procesu lub wątku z tym samym nameTemplate
argumentem _mktemp
sprawdza nazwy plików, które pasują do nazw zwracanych przez _mktemp
w poprzednich wywołaniach. Jeśli żaden plik nie istnieje dla danej nazwy, _mktemp
zwraca tę nazwę. Jeśli pliki istnieją dla wszystkich poprzednio zwracanych nazw, tworzy nową nazwę, _mktemp
zastępując znak alfabetyczny używany w wcześniej zwróconej nazwie następną małą literą, w kolejności od "a" do "z". Jeśli na przykład base
:
fn
a pięciocyfrowa wartość podana przez _mktemp
element to 12345, zwracane imię to:
fna12345
Jeśli ta nazwa jest używana do tworzenia pliku FNA12345 i ten plik nadal istnieje, następna nazwa zwracana przy wywołaniu z tego samego procesu lub wątku o tym samym base
dla nameTemplate
:
fnb12345
Jeśli FNA12345 nie istnieje, zwracana jest kolejna nazwa:
fna12345
_mktemp
Program może utworzyć maksymalnie 26 unikatowych nazw plików dla dowolnej kombinacji base
wartości i nameTemplate
. W związku z tym FNZ12345 jest ostatnią unikatową nazwą _mktemp
pliku, która może zostać utworzona dla base
wartości i nameTemplate
użytych w tym przykładzie.
Po awarii errno
jest ustawiona. Jeśli nameTemplate
ma nieprawidłowy format (na przykład mniej niż sześć znaków X), errno
jest ustawiony na EINVAL
wartość . Jeśli _mktemp
nie można utworzyć unikatowej nazwy, ponieważ wszystkie 26 możliwych nazw plików już istnieje, _mktemp
ustawia parametr nameTemplate na pusty ciąg i zwraca wartość EEXIST
.
W języku C++te funkcje mają przeciążenia szablonu, które wywołują nowsze, bezpieczne odpowiedniki tych funkcji. Aby uzyskać więcej informacji, zobacz Bezpieczne przeciążenia szablonów.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
_mktemp |
<io.h> |
_wmktemp |
<io.h> lub <wchar.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
// 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.
Zobacz też
Obsługa plików
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
, , _wtempnam
, , tmpnam
_wtmpnam
tmpfile