Compartir a través de


_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 topciones , cy 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