Namespaces
Variants

freopen, freopen_s

De es.cppreference.net
< c | io
 
 
Entrada/salida de archivos
Tipos y objetos
        
Funciones
Acceso a archivos
(C95)
Entrada/salida sin formato
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Entrada formateada
Entrada/salida directa
Salida formateada
Posicionamiento de archivo
Manejo de errores
Operaciones sobre archivos
 
Definido en el encabezado <stdio.h>
FILE* freopen( const char* filename, const char* mode,
               FILE* stream );
(1) (until C99)
FILE* freopen( const char* restrict filename, const char* restrict mode,
               FILE* restrict stream );
(since C99)
errno_t freopen_s( FILE* restrict* restrict newstreamptr,
                   const char* restrict filename, const char* restrict mode,
                   FILE* restrict stream );
(2) (since C11)
1) Primero, intenta cerrar el archivo asociado con stream, ignorando cualquier error. Luego, si filename no es nulo, intenta abrir el archivo especificado por filename usando mode como si fuera mediante fopen, y asocia ese archivo con el flujo de archivo apuntado por stream. Si filename es un puntero nulo, entonces la función intenta reabrir el archivo que ya está asociado con stream (está definido por la implementación qué cambios de modo se permiten en este caso).
2) Igual que (1), excepto que mode se trata como en fopen_s y que el puntero al flujo de archivo se escribe en newstreamptr y los siguientes errores se detectan en tiempo de ejecución y llaman a la función constraint handler actualmente instalada:
  • newstreamptr es un puntero nulo
  • stream es un puntero nulo
  • mode es un puntero nulo
Como con todas las funciones con verificación de límites, freopen_s solo está garantizado que esté disponible 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>.

Parámetros

filename - nombre del archivo al que asociar el flujo de archivo
mode - cadena de caracteres terminada en nulo que determina el nuevo modo de acceso al archivo
stream - el flujo de archivo a modificar
newstreamptr - puntero a un puntero donde la función almacena el resultado (un parámetro de salida)

Banderas de acceso a archivos

Cadena de
modo de acceso a archivo
Significado Explicación Acción si el archivo
ya existe
Acción si el archivo
no existe
"r" "r" lectura leer desde el inicio error al abrir
"w" "w" escritura destruir contenido crear nuevo
"a" "a" adición escribir al final crear nuevo
"r+" "r+" lectura extendida leer desde el inicio error
"w+" "w+" escritura extendida destruir contenido crear nuevo
"a+" "a+" adición extendida escribir al final crear nuevo
La bandera de modo de acceso a archivo "b" puede especificarse opcionalmente para abrir un archivo en modo binario. Esta bandera no tiene efecto en sistemas POSIX, pero en Windows deshabilita el manejo especial de '\n' y '\x1A'.
En los modos de acceso de adición, los datos se escriben al final del archivo independientemente de la posición actual del indicador de posición del archivo.
El comportamiento es indefinido si el modo no es una de las cadenas listadas anteriormente. Algunas implementaciones definen modos adicionales soportados (p. ej., Windows).
En modo de actualización ('+'), se pueden realizar tanto entrada como salida, pero la salida no puede ir seguida de entrada sin una llamada intermedia a fflush, fseek, fsetpos o rewind, y la entrada no puede ir seguida de salida sin una llamada intermedia a fseek, fsetpos o rewind, a menos que la operación de entrada haya encontrado el final del archivo. En modo de actualización, las implementaciones pueden usar modo binario incluso si se especifica modo texto.
La bandera de modo de acceso a archivo "x" puede añadirse opcionalmente a los especificadores "w" o "w+". Esta bandera obliga a la función a fallar si el archivo existe, en lugar de sobrescribirlo. (C11)
Al usar fopen_s o freopen_s, los permisos de acceso al archivo para cualquier archivo creado con "w" o "a" impiden que otros usuarios accedan a él. La bandera de modo de acceso a archivo "u" puede anteponerse opcionalmente a cualquier especificador que comience con "w" o "a", para habilitar los permisos predeterminados de fopen. (C11)

Valor de retorno

1) Una copia del valor de stream en caso de éxito, puntero nulo en caso de error.
2) cero en caso de éxito (y se escribe una copia del valor de stream en *newstreamptr, distinto de cero en caso de error (y se escribe un puntero nulo en *newstreamptr a menos que newstreamptr sea en sí mismo un puntero nulo).

Notas

freopen es la única forma de cambiar la orientación estrecha/amplia de un flujo una vez que ha sido establecida por una operación de E/S o por fwide.

La versión de Microsoft CRT de freopen no admite ningún cambio de modo cuando filename es un puntero nulo y lo trata como un error (véase documentación). Una posible solución es la función no estándar _setmode().

Ejemplo

El siguiente código redirige stdout a un archivo.

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

int main(void)
{
    puts("stdout is printed to console");
    if (freopen("redir.txt", "w", stdout) == NULL)
    {
       perror("freopen() failed");
       return EXIT_FAILURE;
    }
    puts("stdout is redirected to a file"); // this is written to redir.txt
    fclose(stdout);
    return EXIT_SUCCESS;
}

Salida:

stdout is printed to console

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.21.5.4 La función freopen (p: TBD)
  • K.3.5.2.2 La función freopen_s (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.21.5.4 La función freopen (p: 224-225)
  • K.3.5.2.2 La función freopen_s (p: 429-430)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.21.5.4 La función freopen (p: 307)
  • K.3.5.2.2 La función freopen_s (p: 590)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.19.5.4 La función freopen (p: 272-273)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.9.5.4 La función freopen

Véase también

abre un archivo
(función)
cierra un archivo
(función)