freopen_s
, _wfreopen_s
Cierra el archivo asociado actualmente a oldStream
y reasigna stream
al archivo que especifica fileName
.
Estas versiones de , _wfreopen
tienen mejoras defreopen
seguridad, como se describe en Características de seguridad de CRT.
Sintaxis
errno_t freopen_s(
FILE ** stream,
const char * fileName,
const char * mode,
FILE* oldStream
);
errno_t _wfreopen_s(
FILE ** stream,
const wchar_t * fileName,
const wchar_t * mode,
FILE * oldStream
);
Parámetros
stream
Parámetro out que apuntará al flujo reabierto cuando la función devuelve un valor.
fileName
Ruta de acceso del archivo que se va a reabrir.
mode
Modo del flujo que se reabre.
oldStream
Flujo que se va a reabrir. Se vacía y se cierran los archivos asociados a él.
Valor devuelto
Cero si es correcto; de lo contrario, un código de error. Si se produce un error, el archivo original se cierra y NULL
se escribe en, a stream
menos stream
que también lo sea. NULL
Para obtener más información sobre los códigos de error, vea errno
, _doserrno
, _sys_errlist
y _sys_nerr
.
Comentarios
La función freopen_s
se usa normalmente para asociar los flujos abiertos previamente asociados a stdin
, stdout
y stderr
a otro archivo.
La freopen_s
función cierra el archivo asociado actualmente a stream
y reasigna stream
al archivo especificado por path
. _wfreopen_s
es una versión con caracteres anchos de freopen_s
; los argumentos path
y mode
para _wfreopen_s
son cadenas de caracteres anchos. Por lo demás,_wfreopen_s
y freopen_s
se comportan de forma idéntica.
Si cualquiera de pFile
, path
, mode
, o stream
es NULL
o si path
es una cadena vacía, estas funciones invocan al controlador de parámetros no válidos, como se describe en Validación de parámetros. Si la ejecución puede continuar, estas funciones establecen errno
en EINVAL
y devuelven EINVAL
.
De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.
Asignaciones de rutinas de texto genérico
Rutina TCHAR.H |
_UNICODE y _MBCS no definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_tfreopen_s |
freopen_s |
freopen_s |
_wfreopen_s |
freopen_s
se suele usar para redirigir los archivos ya abiertos stdin
, stdout
y stderr
a los archivos especificados por el usuario. El nuevo archivo asociado a stream
se abre con mode
, que es una cadena de caracteres que especifica el tipo de acceso solicitado para el archivo, como se indica a continuación:
mode |
Access |
---|---|
"r" |
Abre para lectura. Si el archivo no existe o no se encuentra, la llamada freopen_s genera un error. |
"w" |
Abre un archivo vacío para escritura. Si el archivo especificado existe, se destruye su contenido. |
"a" |
Abre para escritura al final del archivo (anexo) sin eliminar el marcador de fin de archivo (EOF) antes de que se escriban nuevos datos en el archivo. Crea el archivo si no existe. |
"r+" |
Abre para lectura y escritura. El archivo debe existir. |
"w+" |
Abre un archivo vacío para lectura y escritura. Si el archivo existe, se destruye su contenido. |
"a+" |
Se abre para lectura y anexado. La operación de anexado incluye la eliminación del marcador EOF antes de que los nuevos datos se escriban en el archivo. El marcador EOF no se restablece una vez completada la escritura. Crea el archivo si no existe. |
Use los tipos "w"
y "w+"
con cuidado, ya que podrían destruir archivos existentes. A partir de C11, puede anexar "x"
a "w"
o "w+"
para provocar que se produzca un error en la función si el archivo existe, en lugar de sobrescribirlo.
Si se abre un archivo con el tipo de acceso "a"
o "a+"
, todas las operaciones de escritura se realizan en el final del archivo. Aunque el puntero de archivo se puede cambiar de posición mediante fseek
o rewind
, el puntero de archivo siempre se mueve al final del archivo antes de que se lleve a cabo cualquier operación de escritura. Por lo tanto, no se pueden sobrescribir los datos existentes.
El modo "a"
no quita el marcador EOF antes de que se anexe contenido al archivo. Una vez realizado el anexado, el comando TYPE de MS-DOS solo muestra los datos hasta el marcador EOF original, y no los datos anexados al archivo. El modo "a+"
quita el marcador EOF antes de que se anexe contenido al archivo. Después de anexar, el comando TYPE de MS-DOS muestra todos los datos del archivo. El modo "a+"
se requiere para anexar a un archivo de streaming terminado con el marcador EOF CTRL+Z.
Cuando se especifica el tipo de acceso "r+"
, "w+"
o "a+"
, se permiten la lectura y la escritura (el archivo está abierto para "actualización"). Sin embargo, si se cambia entre lectura y escritura, debe haber una operación intermedia fsetpos
, fseek
o rewind
. Si se quiere, se puede especificar la posición actual para la operación fsetpos
o fseek
. Además de los valores anteriores, uno de los caracteres siguientes se puede incluir en la cadena de mode
para especificar el modo de traducción para las nuevas líneas.
Modificador mode |
Modo de traducción |
---|---|
t |
Abra en modo de texto (traducido). |
b |
Abra en modo binario (sin traducir); las traducciones que implican los caracteres de retorno de carro y avance de línea se suprimen. |
En el modo de texto (traducido); las combinaciones de retorno de carro-avance de línea (CR-LF) se convierten en caracteres únicos de avance de línea (LF) en la entrada; los caracteres de LF se traducen en combinaciones de CR-LF en la salida. Además, CTRL+Z se interpreta como carácter de final de archivo en la entrada. En archivos abiertos para lectura, o para escritura y lectura, con "a+"
, la biblioteca en tiempo de ejecución comprueba si hay un CTRL+Z al final del archivo y lo quita, si es posible. Se quita porque usar fseek
y ftell
mover dentro de un archivo puede provocar fseek
que se comporte incorrectamente cerca del final del archivo. No use la opción t
cuando quiera portabilidad ANSI, ya que es una extensión de Microsoft.
Si no se especifica t
o b
en mode
, el modo de traducción predeterminado lo define la variable global _fmode
. Si se agrega t
o b
como prefijo al argumento, se produce un error en la función y devuelve NULL
.
Para obtener una descripción de los modos de texto y binario, consulte E/S de archivo en modo texto y en modo binario.
Requisitos
Función | Encabezado necesario |
---|---|
freopen_s |
<stdio.h> |
_wfreopen_s |
<stdio.h> o <wchar.h> |
La consola no se admite en las aplicaciones de la Plataforma universal de Windows (UWP). Los identificadores de flujo estándar asociados a la consola, stdin
, stdout
y stderr
, se deben redirigir antes de que las funciones en tiempo de ejecución de C puedan usarlos en aplicaciones para UWP.
Para obtener más información sobre compatibilidad, consulte Compatibilidad.
Ejemplo
// crt_freopen_s.c
// This program reassigns stderr to the file
// named FREOPEN.OUT and writes a line to that file.
#include <stdio.h>
#include <stdlib.h>
FILE *stream;
int main( void )
{
errno_t err;
// Reassign "stderr" to "freopen.out":
err = freopen_s( &stream, "freopen.out", "w", stderr );
if( err != 0 )
fprintf( stdout, "error on freopen\n" );
else
{
fprintf( stdout, "successfully reassigned\n" );
fflush( stdout );
fprintf( stream, "This will go to the file 'freopen.out'\n" );
fclose( stream );
}
system( "type freopen.out" );
}
successfully reassigned
This will go to the file 'freopen.out'
Vea también
Stream I/O
freopen
, _wfreopen
fclose
, _fcloseall
_fdopen
, _wfdopen
_fileno
fopen
, _wfopen
_open
, _wopen
_setmode