_fdopen
, _wfdopen
Asocia un flujo a un archivo que se abrió previamente para E/S de bajo nivel.
Sintaxis
FILE *_fdopen(
int fd,
const char *mode
);
FILE *_wfdopen(
int fd,
const wchar_t *mode
);
Parámetros
fd
Descriptor del archivo abierto.
mode
Tipo de acceso a archivos.
Valor devuelto
Cada una de estas funciones devuelve un puntero al flujo abierto. Un valor de puntero null indica un error. Si se produce un error, se invoca al controlador de parámetros no válidos, tal y como se describe en Validación de parámetros. Si la ejecución puede continuar, errno
se establece en EBADF
, que indica un descriptor de archivo incorrecto, o en EINVAL
, que indica que mode
era un puntero nulo.
Para obtener más información sobre estos y otros códigos de error, vea errno
, _doserrno
, _sys_errlist
y _sys_nerr
.
Comentarios
La función _fdopen
asocia un flujo de E/S al archivo identificado por fd
, lo que permite almacenar en búfer y dar formato a un archivo que está abierto para E/S de bajo nivel. _wfdopen
es una versión con caracteres anchos de _fdopen
; el argumento mode
para _wfdopen
es una cadena de caracteres anchos. De lo contrario, _wfdopen
y _fdopen
se comportan de forma idéntica.
Los descriptores de archivo pasados en _fdopen
son propiedad de la secuencia FILE *
devuelta. Si _fdopen
se ejecuta correctamente, no llame a _close
en el descriptor de archivo. Al llamar a fclose
en el FILE *
devuelto también se cierra el descriptor de archivo.
De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiarlo, consulte Estado global en CRT.
La cadena de caracteres mode
especifica el tipo de acceso a archivos requerido para el archivo:
mode |
Access |
---|---|
"r" |
Abre para lectura. Si el archivo no existe o no se encuentra, la llamada fopen 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). 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. Crea el archivo si no existe. |
Cuando un archivo se abre con el tipo de acceso de "a"
o de "a+"
, todas las operaciones de escritura aparecen al final del archivo. Se puede cambiar la posición del puntero de archivo mediante fseek
o rewind
, pero siempre se vuelve a colocar al final del archivo antes de que se lleve a cabo cualquier operación de escritura, de modo que los datos existentes no se puedan sobrescribir. 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 fflush
, fsetpos
, fseek
o rewind
. Puede especificar la posición actual para la operación fsetpos
o fseek
, si lo desea.
Además de los valores anteriores, también se pueden incluir los siguientes caracteres en mode
para especificar el modo de traducción para los caracteres de nueva línea:
Modificador mode |
Comportamiento |
---|---|
t |
Abra en modo de texto (traducido). En este modo, las combinaciones de retorno de carro-avance de línea (CR-LF) se convierten en avances de una línea (LF) en la entrada, y 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. |
b |
Abre en modo binario (sin traducir). Las traducciones del modo t se suprimen. |
c |
Habilite la marca de confirmación para el filename asociado para que el contenido del búfer del archivo se escriba directamente en disco si se llama a fflush o a _flushall . |
n |
Restablezca la marca de confirmación para el filename asociado a "no-commit". Esta marca es la predeterminada. También invalida la marca de confirmación global si enlaza el programa a Commode.obj . El valor predeterminado de la marca de confirmación global es "sin confirmación" a menos que vincule explícitamente el programa a Commode.obj . |
Las t
opciones , c
y n
mode
son extensiones de Microsoft para fopen
y _fdopen
. No las use si desea conservar la portabilidad ANSI.
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.
Los caracteres válidos para la cadena mode
que se usa en fopen
y _fdopen
corresponden a los argumentos oflag
que se usan en _open
y _sopen
de la manera siguiente:
Caracteres de la cadena mode |
Valor oflag equivalente para _open y _sopen |
---|---|
a |
_O_WRONLY | _O_APPEND (normalmente _O_WRONLY | _O_CREAT | _O_APPEND ) |
a+ |
_O_RDWR | _O_APPEND (normalmente _O_RDWR | _O_APPEND | _O_CREAT ) |
r |
_O_RDONLY |
r+ |
_O_RDWR |
w |
_O_WRONLY (normalmente _O_WRONLY | _O_CREAT | _O_TRUNC ) |
w+ |
_O_RDWR (normalmente _O_RDWR | _O_CREAT | _O_TRUNC ) |
b |
_O_BINARY |
t |
_O_TEXT |
c |
None |
n |
None |
Requisitos
Función | Encabezado necesario | Encabezado C++ |
---|---|---|
_fdopen |
<stdio.h> |
<cstdio> |
_wfdopen |
<stdio.h> o <wchar.h> |
<cstdio> |
Para obtener más información sobre el cumplimiento de los estándares y las convenciones de nomenclatura de la biblioteca de runtime de C, vea Compatibilidad.
Asignaciones de rutinas de texto genérico
Rutina <tchar.h> |
_UNICODE y _MBCS no definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_tfdopen |
_fdopen |
_fdopen |
_wfdopen |
Ejemplo
// crt_fdopen.c
// This program opens a file by using low-level
// I/O, then uses _fdopen to switch to stream
// access. It counts the lines in the file.
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <share.h>
int main( void )
{
FILE *stream;
int fd, count = 0;
char inbuf[128];
// Open a file.
if( _sopen_s( &fd, "crt_fdopen.txt", _O_RDONLY, _SH_DENYNO, 0 ) )
exit( 1 );
// Get stream from file descriptor.
if( (stream = _fdopen( fd, "r" )) == NULL )
exit( 1 );
while( fgets( inbuf, 128, stream ) != NULL )
count++;
// After _fdopen, close by using fclose, not _close.
fclose( stream );
printf( "Lines in file: %d\n", count );
}
Entrada: crt_fdopen.txt
Line one
Line two
Output
Lines in file: 2
Consulte también
E/S de secuencia
_dup
, _dup2
fclose
, _fcloseall
fopen
, _wfopen
freopen
, _wfreopen
_open
, _wopen