_mktemp_s
, _wmktemp_s
Tworzy unikatową nazwę pliku. Te funkcje to wersje programu _mktemp
_wmktemp
z ulepszeniami zabezpieczeń zgodnie z opisem w temacie Funkcje zabezpieczeń w narzędziu CRT.
Składnia
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
Parametry
nameTemplate
Wzorzec nazwy pliku.
sizeInChars
Rozmiar buforu w postaci znaków jednobajtowych w _mktemp_s
obiekcie ; znaki szerokie w _wmktemp_s
obiekcie , w tym terminator o wartości null.
Wartość zwracana
Obie te funkcje zwracają zero w przypadku powodzenia; kod błędu dotyczący błędu.
Warunki błędu
nameTemplate |
sizeInChars |
Wartość zwracana | Nowa wartość w nameTemplate |
---|---|---|---|
NULL |
dowolny | EINVAL |
NULL |
Niepoprawny format (zobacz sekcję Uwagi, aby uzyskać poprawny format) | dowolny | EINVAL |
pusty ciąg |
dowolny | <= liczba znaków X | EINVAL |
pusty ciąg |
Jeśli wystąpi którykolwiek z powyższych warunków błędu, wywoływana jest nieprawidłowa procedura obsługi parametrów, zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonywanie jest dozwolone do kontynuowania, jest ustawione na EINVAL
, errno
a funkcje zwracają wartość EINVAL
.
Uwagi
Funkcja _mktemp_s
tworzy unikatową nazwę pliku, modyfikując nameTemplate
argument, tak aby po wywołaniu nameTemplate
wskaźnik wskazywał ciąg zawierający nową nazwę pliku. _mktemp_s
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_s
jest wersją szerokoznakową ; _mktemp_s
argument argument _wmktemp_s
jest ciągiem o szerokim znaku. _wmktemp_s
i _mktemp_s
zachowują się identycznie inaczej, z tą różnicą, że _wmktemp_s
nie obsługuje ciągów wielobajtowych znaków.
Wersje biblioteki debugowania tych funkcji najpierw wypełniają bufor 0xFE. Aby wyłączyć to zachowanie, użyj polecenia _CrtSetDebugFillThreshold
.
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_s |
_mktemp_s |
_mktemp_s |
_wmktemp_s |
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_s
element . Każdy symbol zastępczy w nameTemplate
elemencie musi być wielkimi literami X. _mktemp_s
zachowuje base
i zastępuje pierwszy końcowy znak X znakiem alfabetycznym. _mktemp_s
Zamienia znaki X, które następują po nim, na wartość pięciocyfrową. 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_s
nameTemplate
. W każdym kolejnym wywołaniu z tego samego procesu lub wątku z tym samym nameTemplate
argumentem _mktemp_s
sprawdza nazwy plików, które pasują do nazw zwracanych przez _mktemp_s
w poprzednich wywołaniach. Jeśli żaden plik nie istnieje dla danej nazwy, _mktemp_s
zwraca tę nazwę. Jeśli pliki istnieją dla wszystkich poprzednio zwracanych nazw, tworzy nową nazwę, _mktemp_s
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_s
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_s
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_s
pliku, która może zostać utworzona dla base
wartości i nameTemplate
użytych w tym przykładzie.
W języku C++używanie tych funkcji jest uproszczone przez przeciążenia szablonu; przeciążenia mogą automatycznie wnioskować długość buforu (eliminując konieczność określenia argumentu rozmiaru) i mogą automatycznie zastępować starsze, niezabezpieczone funkcje nowszymi, bezpiecznymi odpowiednikami. Aby uzyskać więcej informacji, zobacz Bezpieczne przeciążenia szablonów.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
_mktemp_s |
<io.h> |
_wmktemp_s |
<io.h> lub <wchar.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
// 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;
}
Przykładowe dane wyjściowe
Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188
Zobacz też
Obsługa plików
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
, , _wtempnam
, , tmpnam
_wtmpnam
tmpfile_s