_mktemp_s
, _wmktemp_s
Erstellt einen eindeutigen Dateinamen. Diese Funktionen sind Versionen von _mktemp
, _wmktemp
mit Sicherheitsverbesserungen wie unter Sicherheitsfunktionen in der CRT beschrieben.
Syntax
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
Muster des Dateinamens.
sizeInChars
Größe des Puffers in _mktemp_s
in Einzelbytezeichen; Breitzeichen in _wmktemp_s
, einschließlich NULL-Terminator.
Rückgabewert
Beide Funktionen geben bei Erfolg null und bei Fehlern einen Fehlercode zurück.
Fehlerbedingungen
nameTemplate |
sizeInChars |
Rückgabewert | Neuer Wert in nameTemplate |
---|---|---|---|
NULL |
any | EINVAL |
NULL |
Falsches Format (siehe Abschnitt "Hinweise" für das richtige Format) | any | EINVAL |
Leere Zeichenfolge |
any | <= Anzahl der X-Zeichen | EINVAL |
Leere Zeichenfolge |
Wenn eine der oben genannten Fehlerbedingungen auftritt, wird der ungültige Parameterhandler aufgerufen, wie in der Parameterüberprüfung beschrieben. Wird die weitere Ausführung zugelassen, wird errno
auf EINVAL
gesetzt, und die Funktionen geben EINVAL
zurück.
Hinweise
Die Funktion _mktemp_s
vergibt einen eindeutigen Dateinamen, indem sie das Argument nameTemplate
ändert. Auf diese Weise verweist der Zeiger für nameTemplate
nach dem Aufruf auf eine Zeichenfolge mit dem neuen Dateinamen. _mktemp_s
behandelt Multibyte-Zeichenfolgenargumente automatisch richtig. Die Erkennung von Multibyte-Zeichenfolgen erfolgt auf Grundlage der vom Laufzeitsystem zum jeweiligen Zeitpunkt verwendeten Multibyte-Codeseite. Bei _wmktemp_s
handelt es sich um eine Breitzeichenversion von _mktemp_s
. Das Argument von _wmktemp_s
ist eine Breitzeichenfolge. _wmktemp_s
und _mktemp_s
verhalten sich identisch, mit der Ausnahme, dass _wmktemp_s
multibyte-Zeichenfolgen nicht behandelt werden.
Die Debugbibliotheksversionen dieser Funktionen füllen zuerst den Puffer mit 0xFE. Verwenden Sie _CrtSetDebugFillThreshold
zum Deaktivieren dieses Verhaltens .
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_s |
_mktemp_s |
_mktemp_s |
_wmktemp_s |
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_s
bereitgestelltes Zeichen handelt. Die einzelnen Platzhalterzeichen in nameTemplate
müssen als X in Großschreibung angegeben sein. _mktemp_s
behält base
bei und ersetzt das erste nachgestellte X mit einem alphabetischen Zeichen. _mktemp_s
Ersetzt die folgenden 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_s
wird nameTemplate
geändert. Bei jedem darauffolgenden Aufruf aus demselben Prozess oder Thread mit demselben Argument nameTemplate
sucht _mktemp_s
nach Dateinamen, die den von _mktemp_s
im Rahmen vorheriger Aufrufe zurückgegebenen Namen entsprechen. Wenn für einen bestimmten Namen keine Datei vorhanden ist, gibt _mktemp_s
diesen Namen zurück. Wenn für alle zuvor zurückgegebenen Namen Dateien vorhanden sind, erstellt _mktemp_s
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_s
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_s
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_s
für die in diesem Beispiel verwendeten Werte für base
und nameTemplate
vergeben kann.
In C++ wird die Verwendung dieser Funktionen durch Vorlagenüberladungen vereinfacht; die Überladungen können automatisch Rückschlüsse auf die Pufferlänge ziehen (wodurch kein Größenargument mehr angegeben werden muss), und sie können automatisch die älteren, nicht sicheren Funktionen durch ihre neueren, sicheren Entsprechungen ersetzen. Weitere Informationen finden Sie unter Secure Template Overloads.
Anforderungen
Routine | Erforderlicher Header |
---|---|
_mktemp_s |
<io.h> |
_wmktemp_s |
<io.h> oder <wchar.h> |
Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.
Beispiel
// 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;
}
Beispielausgabe
Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188
Siehe auch
Dateibehandlung
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
, , _wtempnam
tmpnam
_wtmpnam
tmpfile_s