freopen, freopen_s
From cppreference.net
|
Definido en el encabezado
<stdio.h>
|
||
| (1) | ||
| (hasta C99) | ||
| (desde C99) | ||
| (2) | (desde 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 están permitidos 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 se detectan los siguientes errores en tiempo de ejecución que llaman a la función
constraint handler
actualmente instalada:
-
-
newstreamptres un puntero nulo -
streames un puntero nulo -
modees un puntero nulo
-
-
Como con todas las funciones con verificación de límites,
freopen_ssolo está garantizada 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> .
Contenidos |
Parámetros
| filename | - | nombre del archivo para asociar al 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" | lectura | Abrir un archivo para lectura | leer desde el inicio | error al abrir |
| "w" | escritura | Crear un archivo para escritura | destruir contenido | crear nuevo |
| "a" | añadir | Añadir a un archivo | escribir al final | crear nuevo |
| "r+" | lectura extendida | Abrir un archivo para lectura/escritura | leer desde el inicio | error |
| "w+" | escritura extendida | Crear un archivo para lectura/escritura | destruir contenido | crear nuevo |
| "a+" | añadir extendido | Abrir un archivo para lectura/escritura | 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 desactiva el manejo especial de
'
\n
'
y
'
\x1A
'
.
En los modos de acceso de añadir, 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 arriba. Algunas implementaciones definen modos adicionales soportados (ej. Windows ). | ||||
| En modo de actualización ( '+' ), tanto entrada como salida pueden realizarse, pero la salida no puede seguir a la entrada sin una llamada intermedia a fflush , fseek , fsetpos o rewind , y la entrada no puede seguir a la salida sin una llamada intermedia a fseek , fsetpos o rewind , a menos que la operación de entrada encuentre el final del archivo. En modo de actualización, se permite a las implementaciones usar modo binario incluso cuando 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 fuerza 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 a 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 fallo.
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 manera de cambiar la orientación estrecha/ancha de un flujo una vez que ha sido establecida por una operación de E/S o por
fwide
.
La versión de CRT de Microsoft de
freopen
no admite ningún cambio de modo cuando
filename
es un puntero nulo y trata esto como un error (consulte la
documentación
). Una posible solución alternativa es la función no estándar
_setmode()
.
Ejemplo
El siguiente código redirige
stdout
a un archivo.
Ejecutar este código
#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 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
|
(C11)
|
abre un archivo
(función) |
|
cierra un archivo
(función) |
|
|
Documentación de C++
para
freopen
|
|