Namespaces
Variants

tmpfile, tmpfile_s

From cppreference.net
< c ‎ | io
Definido en el encabezado <stdio.h>
FILE * tmpfile ( void ) ;
(1)
errno_t tmpfile_s ( FILE * restrict * restrict streamptr ) ;
(2) (desde C11)
1) Crea y abre un archivo temporal. El archivo se abre como archivo binario para actualización (como si fuera mediante fopen con modo "wb+" ). Se garantiza que el nombre del archivo será único dentro del sistema de archivos. Al menos TMP_MAX archivos pueden abrirse durante la vida útil de un programa (este límite puede compartirse con tmpnam y puede estar más limitado por FOPEN_MAX ).
2) Igual que (1) , excepto que al menos TMP_MAX_S archivos pueden ser abiertos (el límite puede ser compartido con tmpnam_s ), y si streamptr es un puntero nulo, se llama a la función constraint handler actualmente instalada.
Como con todas las funciones con verificación de límites, tmpfile_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> .

El archivo temporal creado por esta función se cierra y elimina cuando el programa termina normalmente. Si se elimina en caso de terminación anormal está definido por la implementación.

Contenidos

Parámetros

1) (ninguno)
2) puntero a un puntero que será actualizado por esta llamada de función

Valor de retorno

1) Puntero al flujo de archivo asociado con el archivo o puntero nulo si ha ocurrido un error.
2) Cero si el archivo fue creado y abierto exitosamente, distinto de cero si el archivo no fue creado o abierto o si streamptr era un puntero nulo. Adicionalmente, el puntero al flujo de archivo asociado se almacena en * streamptr en caso de éxito, y un valor de puntero nulo se almacena en * streamptr en caso de error.

Notas

En algunas implementaciones (por ejemplo, Linux antiguo), esta función realmente crea, abre y elimina inmediatamente el archivo del sistema de archivos: mientras un programa mantenga un descriptor de archivo abierto a un archivo eliminado, el archivo existe, pero como fue eliminado, su nombre no aparece en ningún directorio, por lo que ningún otro proceso puede abrirlo. Una vez que se cierra el descriptor de archivo, o una vez que el programa termina (normal o anormalmente), el espacio ocupado por el archivo es reclamado por el sistema de archivos. Linux más reciente (desde 3.11 o posterior, dependiendo del sistema de archivos) crea tales archivos temporales invisibles en un solo paso, mediante un flag especial en la llamada al sistema open() .

En algunas implementaciones (por ejemplo, Windows), se requieren privilegios elevados ya que la función puede crear el archivo temporal en un directorio del sistema.

Ejemplo

#define _POSIX_C_SOURCE 200112L
#include <stdio.h>
#include <unistd.h>
int main(void)
{
    printf("TMP_MAX = %d, FOPEN_MAX = %d\n", TMP_MAX, FOPEN_MAX);
    FILE* tmpf = tmpfile();
    fputs("Hello, world", tmpf);
    rewind(tmpf);
    char buf[6];
    fgets(buf, sizeof buf, tmpf);
    printf("got back from the file: '%s'\n", buf);
    // Linux-specific method to display the tmpfile name
    char fname[FILENAME_MAX], link[FILENAME_MAX] = {0};
    sprintf(fname, "/proc/self/fd/%d", fileno(tmpf));
    if (readlink(fname, link, sizeof link - 1) > 0)
        printf("File name: %s\n", link);
}

Salida posible:

TMP_MAX = 238328, FOPEN_MAX = 16
got back from the file: 'Hello'
File name: /tmp/tmpfjptPe5 (deleted)

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.21.4.3 La función tmpfile (p: TBD)
  • K.3.5.1.1 La función tmpfile_s (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.21.4.3 La función tmpfile (p: 222)
  • K.3.5.1.1 La función tmpfile_s (p: 427)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.21.4.3 La función tmpfile (p: 303)
  • K.3.5.1.1 La función tmpfile_s (p: 586-587)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.19.4.3 La función tmpfile (p: 269)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.9.4.3 La función tmpfile

Véase también

devuelve un nombre de archivo único
(función)