Поделиться через


_tempnam, _wtempnam, tmpnam, _wtmpnam

Формирует имена, которые можно использовать для создания временных файлов. Доступны более безопасные версии некоторых из этих функций; see tmpnam_s, _wtmpnam_s.

Синтаксис

char *_tempnam(
   const char *dir,
   const char *prefix
);
wchar_t *_wtempnam(
   const wchar_t *dir,
   const wchar_t *prefix
);
char *tmpnam(
   char *str
);
wchar_t *_wtmpnam(
   wchar_t *str
);

Параметры

prefix
Строка, которая предопределена именам _tempnam, возвращаемыми .

dir
Путь, используемый в имени файла, если нет переменной среды TMP или если TMP не является допустимым каталогом.

str
Указатель, содержащий созданное имя, идентичное имени, возвращаемого функцией. Это удобный способ сохранения созданного имени.

Возвращаемое значение

Каждая из этих функций возвращает указатель на имя, созданное или NULL если произошел сбой. Сбой может произойти при попытке больше TMP_MAX (см. STDIO). H) вызывает вызовы или tmpnam если используется _tempnam , а в переменной TMP среды и в dir параметре указан недопустимый имя каталога.

Примечание.

Указатели, возвращенные функциями tmpnam и _wtmpnam, указывают на внутренние статические буфера. free не следует вызывать для освобождения этих указателей. Функцию free необходимо вызывать для указателей, размещенных в памяти функциями _tempnam и _wtempnam.

Замечания

Каждая из этих функций возвращает имя файла, который в настоящее время не существует. tmpnam возвращает имя, уникальное в указанном временном каталоге Windows, возвращенном GetTempPathW. _tempnam создает уникальное имя в каталоге, отличном от указанного. Если имя файла добавляется с обратной косой чертой и нет сведений о пути, например \fname21, указывает, что имя допустимо для текущего рабочего каталога.

В случае функции tmpnam это сформированное имя файла можно сохранить в параметре str. Если параметр str имеет значение NULL, функция tmpnam оставляет результат во внутреннем статическом буфере. Поэтому все последующие вызовы уничтожают это значение. Имя, сформированное функцией tmpnam, состоит из программно формируемого имени файла и, после первого вызова функции tmpnam, расширения файла из последовательных чисел с основанием 32 (.1–.vvu, если параметр TMP_MAX в файле STDIO.H имеет значение 32 767).

_tempnam создает уникальное имя файла для каталога, выбранного следующими правилами:

  • Если переменная среды TMP определена и задана в допустимое имя каталога, для каталога, указанного TMP, создаются уникальные имена файлов.

  • Если переменная среды TMP не определена или если задано имя каталога, который не существует, _tempnam использует dir параметр в качестве пути, для которого он создает уникальные имена.

  • Если переменная среды TMP не определена или задано имя каталога, который не существует, и если dirNULL имя каталога, который не существует, _tempnam использует текущий рабочий каталог для создания уникальных имен. В настоящее время, если TMP и dir укажите имена каталогов, которые не существуют, вызов функции _tempnam завершается сбоем.

Имя, возвращаемое _tempnam путем объединения prefix , и последовательного числа, которые объединяются для создания уникального имени файла для указанного каталога. Функция _tempnam формирует имена файлов, не имеющие расширение. _tempnam используется malloc для выделения пространства для имени файла; программа отвечает за освобождение этого пространства, если оно больше не требуется.

Функции _tempnam и tmpnam автоматически корректно обрабатывают многобайтовые строковые аргументы, распознавая последовательности многобайтовых символов согласно кодовой странице OEM, полученной из операционной системы. _wtempnam — это версия функции _tempnam для расширенных символов; аргументы и возвращаемое значение функции _wtempnam являются строками с расширенными символами. _wtempnam и _tempnam ведет себя одинаково, за исключением того, что _wtempnam не обрабатывает строки многобайтовых символов. _wtmpnam — это версия с расширенными символами для tmpnam; аргумент и возвращаемое значение _wtmpnam являются строками с расширенными символами. _wtmpnam и tmpnam ведет себя одинаково, за исключением того, что _wtmpnam не обрабатывает строки многобайтовых символов.

Если _DEBUG и _CRTDBG_MAP_ALLOC определены, _tempnam_wtempnam и заменяются вызовами _tempnam_dbg и _wtempnam_dbg.

Сопоставления подпрограмм универсального текста

Подпрограмма TCHAR.H _UNICODE и _MBCS не определен _MBCS Определенные _UNICODE Определенные
_ttmpnam tmpnam tmpnam _wtmpnam
_ttempnam _tempnam _tempnam _wtempnam

Требования

Маршрут Обязательный заголовок
_tempnam <stdio.h>
_wtempnam, _wtmpnam <stdio.h> или <wchar.h>
tmpnam <stdio.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

// crt_tempnam.c
// compile with: /W3
// This program uses tmpnam to create a unique filename in the
// temporary directory, and _tempname to create a unique filename
// in C:\\tmp.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char * name1 = NULL;
   char * name2 = NULL;
   char * name3 = NULL;

   // Create a temporary filename for the current working directory:
   if ((name1 = tmpnam(NULL)) != NULL) { // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf("%s is safe to use as a temporary file.\n", name1);
   } else {
      printf("Cannot create a unique filename\n");
   }

   // Create a temporary filename in temporary directory with the
   // prefix "stq". The actual destination directory may vary
   // depending on the state of the TMP environment variable and
   // the global variable P_tmpdir.

   if ((name2 = _tempnam("c:\\tmp", "stq")) != NULL) {
      printf("%s is safe to use as a temporary file.\n", name2);
   } else {
      printf("Cannot create a unique filename\n");
   }

   // When name2 is no longer needed:
   if (name2) {
      free(name2);
   }

   // Unset TMP environment variable, then create a temporary filename in C:\tmp.
   if (_putenv("TMP=") != 0) {
      printf("Could not remove TMP environment variable.\n");
   }

   // With TMP unset, we'll use C:\tmp as the temporary directory.
   // Create a temporary filename in C:\tmp with prefix "stq".
   if ((name3 = _tempnam("c:\\tmp", "stq")) != NULL) {
      printf("%s is safe to use as a temporary file.\n", name3);
   }
   else {
      printf("Cannot create a unique filename\n");
   }

   // When name3 is no longer needed:
   if (name3) {
      free(name3);
   }

   return 0;
}
C:\Users\LocalUser\AppData\Local\Temp\sriw.0 is safe to use as a temporary file.
C:\Users\LocalUser\AppData\Local\Temp\stq2 is safe to use as a temporary file.
c:\tmp\stq3 is safe to use as a temporary file.

См. также

Потоковый ввод-вывод
_getmbcp
malloc
_setmbcp
tmpfile
tmpfile_s