Namespaces
Variants

tmpnam, tmpnam_s

From cppreference.net
< c ‎ | io
Definido en el encabezado <stdio.h>
char * tmpnam ( char * filename ) ;
(1)
errno_t tmpnam_s ( char * filename_s, rsize_t maxsize ) ;
(2) (desde C11)
#define TMP_MAX        /*unspecified*/
#define TMP_MAX_S      /*unspecified*/
(desde C11)
#define L_tmpnam       /*unspecified*/
#define L_tmpnam_s     /*unspecified*/
(desde C11)
1) Crea un nombre de archivo válido único (no más largo que L_tmpnam en longitud) y lo almacena en la cadena de caracteres apuntada por filename . La función es capaz de generar hasta TMP_MAX nombres de archivo únicos, pero algunos o todos pueden estar en uso en el sistema de archivos y por lo tanto no ser valores de retorno adecuados.
2) Igual que (1) , excepto que se pueden generar hasta TMP_MAX_S nombres, con una longitud no mayor a L_tmpnam_s , y se detectan los siguientes errores en tiempo de ejecución que llaman a la función constraint handler actualmente instalada:
  • filename_s es un puntero nulo
  • maxsize es mayor que RSIZE_MAX
  • maxsize es menor que la cadena del nombre de archivo generado
Como con todas las funciones con verificación de límites, tmpnam_s solo está garantizada su disponibilidad si __STDC_LIB_EXT1__ está definido por la implementación y si el usuario define __STDC_WANT_LIB_EXT1__ como la constante entera 1 antes de incluir <stdio.h> .

tmpnam y tmpnam_s modifican estado estático (que puede ser compartido entre estas funciones) y no requieren ser seguras para hilos.

Contenidos

Parámetros

filename - puntero al arreglo de caracteres capaz de contener al menos L_tmpnam bytes, para ser usado como búfer de resultado. Si se pasa un puntero nulo, se devuelve un puntero a un búfer interno estático.
filename_s - puntero al arreglo de caracteres capaz de contener al menos L_tmpnam_s bytes, para ser usado como búfer de resultado.
maxsize - número máximo de caracteres que la función puede escribir (normalmente el tamaño del arreglo filename_s ).

Valor de retorno

1) filename si filename no era un puntero nulo. De lo contrario, se devuelve un puntero a un búfer interno estático. Si no se puede generar un nombre de archivo adecuado, se devuelve un puntero nulo.
2) Retorna cero y escribe el nombre del archivo en filename_s en caso de éxito. En caso de error, retorna un valor distinto de cero y escribe el carácter nulo en filename_s [ 0 ] (solo si filename_s no es nulo y maxsize no es cero y no es mayor que RSIZE_MAX ).

Notas

Aunque los nombres generados por tmpnam son difíciles de adivinar, es posible que un archivo con ese nombre sea creado por otro proceso entre el momento en que tmpnam retorna y el momento en que este programa intenta usar el nombre devuelto para crear un archivo. La función estándar tmpfile y la función POSIX mkstemp no tienen este problema (crear un directorio único usando solo la biblioteca estándar de C todavía requiere el uso de tmpnam ).

Los sistemas POSIX definen adicionalmente la función de nombre similar tempnam , que ofrece la opción de un directorio (que por defecto es el macro opcionalmente definido P_tmpdir ).

Ejemplo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    // Nota: el compilador/enlazador puede emitir una advertencia de seguridad, ej. GCC:
    // "warning: el uso de `tmpnam' es peligroso, es mejor usar `mkstemp'"
    char* name1 = tmpnam(NULL);
    printf("temporary file name: %s\n", name1);
    char name2[L_tmpnam];
    if (tmpnam(name2))
        printf("temporary file name: %s\n", name2);
    // POSIX ofrece mkstemp. La siguiente declaración podría ser
    // necesaria ya que mkstemp está ausente en el estándar C <stdlib.h>.
    int mkstemp(char*);
    char name3[] = "/tmp/fileXXXXXX"; // se requieren al menos seis 'X' ^_^
    int file_descriptor = mkstemp(name3);
    if (file_descriptor != -1)
        printf("temporary file name: %s\n", name3);
    else
        perror("mkstemp");
}

Salida posible:

temporary file name: /tmp/file90dLlR
temporary file name: /tmp/fileY9LWAg
temporary file name: /tmp/filexgv8PF

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.21.4.4 La función tmpnam (p: TBD)
  • K.3.5.1.2 La función tmpnam_s (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.21.4.4 La función tmpnam (p: 222)
  • K.3.5.1.2 La función tmpnam_s (p: 427-428)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.21.4.4 La función tmpnam (p: 303-304)
  • K.3.5.1.2 La función tmpnam_s (p: 587-588)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.19.4.4 La función tmpnam (p: 269-270)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.9.4.4 La función tmpnam

Véase también

devuelve un puntero a un archivo temporal
(función)