_mktemp
, _wmktemp
Erstellt einen eindeutigen Dateinamen. Sicherere Versionen dieser Funktionen sind verfügbar. Informationen dazu finden Sie unter _mktemp_s
, _wmktemp_s
.
Syntax
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
Parameter
nameTemplate
Muster des Dateinamens.
Rückgabewert
Jede dieser Funktionen gibt einen Zeiger auf die geänderte nameTemplate zurück. Die Funktion gibt zurück NULL
, wenn nameTemplate
sie schlecht gebildet ist oder keine eindeutigen Namen aus der angegebenen nameTemplate erstellt werden können.
Hinweise
Die Funktion _mktemp
vergibt einen eindeutigen Dateinamen, indem das Argument nameTemplate
geändert wird. _mktemp
behandelt Multibyte-Zeichenfolgenargumente automatisch richtig. Die Erkennung von Multibyte-Zeichenfolgen erfolgt auf Grundlage der vom Laufzeitsystem zum jeweiligen Zeitpunkt verwendeten Multibyte-Codeseite. _wmktemp
ist eine Breitzeichenversion von _mktemp
. Das Argument und der Rückgabewert von _wmktemp
sind Zeichenfolgen mit Breitzeichen. _wmktemp
und _mktemp
verhalten sich identisch, mit der Ausnahme, dass _wmktemp
multibyte-Zeichenfolgen nicht behandelt werden.
Standardmäßig gilt der globale Zustand dieser Funktion für die Anwendung. Wie Sie dieses Verhalten ändern, erfahren Sie unter Globaler Status in der CRT.
Mapping generischer Textroutinen
Tchar.h-Routine | _UNICODE und _MBCS nicht definiert |
_MBCS definiert |
_UNICODE definiert |
---|---|---|---|
_tmktemp |
_mktemp |
_mktemp |
_wmktemp |
Das Argument nameTemplate
hat das Format baseXXXXXX
, wobei es sich bei base
um den von Ihnen angegebenen Teil des neuen Dateinamens und bei den einzelnen X um Platzhalter für ein von _mktemp
bereitgestelltes Zeichen handelt. Die einzelnen Platzhalterzeichen in nameTemplate
müssen als X in Großschreibung angegeben sein. _mktemp
behält base
bei und ersetzt das erste nachgestellte X mit einem alphabetischen Zeichen. _mktemp
Ersetzt die nachfolgenden X-Zeichen durch einen fünfstelligen Wert. Dieser Wert ist eine eindeutige Zahl, die den aufrufenden Prozess oder in Multithread-Programmen identifiziert, den aufrufenden Thread.
Bei jedem erfolgreichen Aufruf von _mktemp
wird nameTemplate
geändert. Bei jedem darauffolgenden Aufruf aus demselben Prozess oder Thread mit demselben Argument nameTemplate
sucht _mktemp
nach Dateinamen, die den von _mktemp
im Rahmen vorheriger Aufrufe zurückgegebenen Namen entsprechen. Wenn für einen bestimmten Namen keine Datei vorhanden ist, gibt _mktemp
diesen Namen zurück. Wenn für alle zuvor zurückgegebenen Namen Dateien vorhanden sind, erstellt _mktemp
einen neuen Namen, indem das im zuvor zurückgegebenen Namen enthaltene alphabetische Zeichen durch den nächsten verfügbaren Kleinbuchstaben (in absteigender Reihenfolge von „a“ bis „z“) ersetzt wird. Ist base
beispielsweise
fn
und der von _mktemp
bereitgestellte fünfstellige Wert 12345, lautet der erste zurückgegebene Name:
fna12345
Wenn dieser Name verwendet wird, um die Datei FNA12345 zu erstellen, und diese Datei noch vorhanden ist, lautet der nächste bei einem Aufruf aus demselben Prozess oder Thread mit demselben base
für nameTemplate
zurückgegebene Name:
fnb12345
Wenn FNA12345 nicht vorhanden ist, wird der nächste zurückgegebene Name erneut angezeigt:
fna12345
_mktemp
kann maximal 26 eindeutige Dateinamen für eine beliebige Kombination von base
und nameTemplate
Werten erstellen. Daher ist FNZ12345 der letzte eindeutige Dateiname, den _mktemp
für die in diesem Beispiel verwendeten Werte für base
und nameTemplate
vergeben kann.
Bei Fehlern wird errno
festgelegt. Wenn nameTemplate
ein ungültiges Format vorhanden ist (z. B. weniger als sechs X Zeichen), errno
wird auf EINVAL
. Wenn _mktemp
kein eindeutiger Name erstellt werden kann, da alle 26 möglichen Dateinamen bereits vorhanden sind, _mktemp
wird nameTemplate auf eine leere Zeichenfolge festgelegt und zurückgegeben EEXIST
.
In C++ haben diese Funktionen Vorlagenüberladungen, mit denen die neueren, sicheren Entsprechungen dieser Funktionen aufgerufen werden. Weitere Informationen finden Sie unter Secure Template Overloads.
Anforderungen
Routine | Erforderlicher Header |
---|---|
_mktemp |
<io.h> |
_wmktemp |
<io.h> oder <wchar.h> |
Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.
Beispiel
// 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.
Siehe auch
Dateibehandlung
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
, , _wtempnam
tmpnam
_wtmpnam
tmpfile