Share via


_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