_mktemp_s
, _wmktemp_s
Membuat nama file yang unik. Fungsi-fungsi ini adalah versi _mktemp
, _wmktemp
dengan peningkatan keamanan seperti yang dijelaskan dalam Fitur keamanan di CRT.
Sintaks
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
Parameter
nameTemplate
Pola nama file.
sizeInChars
Ukuran buffer dalam karakter byte tunggal dalam _mktemp_s
; karakter lebar dalam _wmktemp_s
, termasuk terminator null.
Nilai hasil
Kedua fungsi ini mengembalikan nol pada keberhasilan; kode kesalahan pada kegagalan.
Kondisi kesalahan
nameTemplate |
sizeInChars |
Nilai hasil | Nilai baru dalam nameTemplate |
---|---|---|---|
NULL |
any | EINVAL |
NULL |
Format yang salah (lihat bagian Keterangan untuk format yang benar) | any | EINVAL |
string kosong |
any | <= jumlah karakter X | EINVAL |
string kosong |
Jika salah satu kondisi kesalahan di atas terjadi, handler parameter yang tidak valid dipanggil, seperti yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk melanjutkan, errno
diatur ke EINVAL
dan fungsi mengembalikan EINVAL
.
Keterangan
Fungsi ini _mktemp_s
membuat nama file unik dengan memodifikasi nameTemplate
argumen, sehingga setelah panggilan, nameTemplate
pointer menunjuk ke string yang berisi nama file baru. _mktemp_s
secara otomatis menangani argumen string multibyte-character yang sesuai, mengenali urutan karakter multibyte sesuai dengan halaman kode multibyte yang saat ini digunakan oleh sistem run-time. _wmktemp_s
adalah versi karakter luas dari _mktemp_s
; argumen dari _wmktemp_s
adalah string karakter lebar. _wmktemp_s
dan _mktemp_s
bertingkah identik jika tidak, kecuali yang _wmktemp_s
tidak menangani string multibyte-character.
Versi pustaka debug dari fungsi-fungsi ini terlebih dahulu mengisi buffer dengan 0xFE. Untuk menonaktifkan perilaku ini, gunakan _CrtSetDebugFillThreshold
.
Secara default, status global fungsi ini dicakup ke aplikasi. Untuk mengubah perilaku ini, lihat Status global di CRT.
Pemetaan rutin teks generik
Rutinitas Tchar.h | _UNICODE dan _MBCS tidak ditentukan |
_MBCS Didefinisikan |
_UNICODE Didefinisikan |
---|---|---|---|
_tmktemp_s |
_mktemp_s |
_mktemp_s |
_wmktemp_s |
Argumen nameTemplate
memiliki formulir baseXXXXXX
, di mana base
adalah bagian dari nama file baru yang Anda berikan dan setiap X adalah tempat penampung untuk karakter yang disediakan oleh _mktemp_s
. Setiap karakter tempat penampung harus nameTemplate
berupa huruf besar X. _mktemp_s
mempertahankan base
dan mengganti X berikutnya dengan karakter alfabet. _mktemp_s
mengganti karakter X yang mengikuti dengan nilai lima digit. Nilai ini adalah nomor unik yang mengidentifikasi proses panggilan, atau dalam program multithreaded, utas panggilan.
Setiap panggilan yang berhasil untuk _mktemp_s
memodifikasi nameTemplate
. Dalam setiap panggilan berikutnya dari proses atau utas yang sama dengan argumen yang sama nameTemplate
, _mktemp_s
memeriksa nama file yang cocok dengan nama yang dikembalikan oleh _mktemp_s
dalam panggilan sebelumnya. Jika tidak ada file untuk nama tertentu, _mktemp_s
mengembalikan nama tersebut. Jika file ada untuk semua nama yang dikembalikan sebelumnya, _mktemp_s
buat nama baru dengan mengganti karakter alfabet yang digunakan dalam nama yang dikembalikan sebelumnya dengan huruf kecil berikutnya yang tersedia, secara berurutan, dari 'a' hingga 'z'. Misalnya, jika base
adalah:
fn
dan nilai lima digit yang disediakan adalah _mktemp_s
12345, nama depan yang dikembalikan adalah:
fna12345
Jika nama ini digunakan untuk membuat file FNA12345 dan file ini masih ada, nama berikutnya yang dikembalikan pada panggilan dari proses atau utas yang sama dengan yang sama base
untuk nameTemplate
adalah:
fnb12345
Jika FNA12345 tidak ada, nama berikutnya yang dikembalikan adalah lagi:
fna12345
_mktemp_s
dapat membuat maksimal 26 nama file unik untuk kombinasi base
nilai dan nameTemplate
yang diberikan. Oleh karena itu, FNZ12345 adalah nama _mktemp_s
file unik terakhir yang dapat dibuat untuk nilai dan nameTemplate
yang base
digunakan dalam contoh ini.
Di C++, menggunakan fungsi-fungsi ini disederhanakan oleh kelebihan beban templat; kelebihan beban dapat menyimpulkan panjang buffer secara otomatis (menghilangkan kebutuhan untuk menentukan argumen ukuran) dan mereka dapat secara otomatis mengganti fungsi lama yang tidak aman dengan rekan-rekan yang lebih baru dan aman. Untuk informasi selengkapnya, lihat Mengamankan kelebihan beban templat.
Persyaratan
Rutin | Header yang diperlukan |
---|---|
_mktemp_s |
<io.h> |
_wmktemp_s |
<io.h> atau <wchar.h> |
Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.
Contoh
// 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;
}
Sampel output
Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188
Baca juga
Penanganan file
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
, _wtempnam
, tmpnam
, _wtmpnam
tmpfile_s
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk