_fsopen, _wfsopen

Abre un flujo con uso compartido de archivos.

Sintaxis

FILE *_fsopen(
   const char *filename,
   const char *mode,
   int shflag
);
FILE *_wfsopen(
   const wchar_t *filename,
   const wchar_t *mode,
   int shflag
);

Parámetros

filename
Nombre del archivo que se va a abrir.

mode
Tipo de acceso permitido.

shflag
Tipo de uso compartido permitido.

Valor devuelto

Cada una de estas funciones devuelve un puntero al flujo. Un valor de puntero null indica un error. Si filename o es o mode una NULL cadena vacía, estas funciones invocan al controlador de parámetros no válidos, tal como se describe en Validación de parámetros. Si la ejecución puede continuar, estas funciones devuelven NULL y establecen errno en EINVAL.

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 _fsopen abre el archivo especificado por filename como un flujo y lo prepara para una lectura o escritura compartida posterior, como establecen los argumentos shflag y el modo. _wfsopen es una versión con caracteres anchos de _fsopen; los argumentos filename y mode para _wfsopen son cadenas de caracteres anchos. Por lo demás,_wfsopen y _fsopen se comportan de forma idéntica.

La cadena de caracteres mode especifica el tipo de acceso solicitado para el archivo, como se muestra en la tabla siguiente.

Término Definición
"r" Abre para lectura. Si el archivo no existe o no se encuentra, la llamada _fsopen genera un error.
"w" Abre un archivo vacío para escritura. Si el archivo especificado existe, se destruye su contenido.
"a" Se abre para escribir al final del archivo (anexando); crea primero 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 especificado existe, se destruye su contenido.
"a+" Abre para leer y anexar; crea primero el archivo si no existe.

Use los tipos "w" y "w+" con cuidado, ya que pueden destruir archivos existentes.

Cuando un archivo se abre con el tipo de acceso "a" o "a+", todas las operaciones de escritura se producen al final del archivo. El puntero de archivo se puede cambiar de posición mediante fseek o rewind, pero 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. Cuando se especifica el tipo de acceso "r+", "w+" o "a+", se permiten la lectura y la escritura (se dice que el archivo está abierto para actualización). Sin embargo, si se cambia entre lectura y escritura, debe intervenir una operación fsetpos, fseek o rewind. Si se desea, 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 mode para especificar el modo de traducción de las nuevas líneas y de la administración de archivos.

Término Definición
t Abre un archivo en modo de texto (traducido). En este modo, las combinaciones de retorno de carro-avance de línea (CR-LF) se traducen 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. En los archivos abiertos para lectura o lectura y escritura, _fsopen 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 que termina con ctrl+Z puede provocar fseek que se comporte incorrectamente cerca del final del archivo.
b Abre un archivo en modo binario (sin traducir); las conversiones anteriores se suprimen.
D Especifica un archivo temporal que se elimina cuando se cierra el último puntero de archivo.
R Especifica que el almacenamiento en caché está optimizado para el acceso aleatorio (pero no restringido a este) desde el disco.
S Especifica que el almacenamiento en caché está optimizado para el acceso secuencial (pero no restringido a este) desde el disco.
T Especifica un archivo que no se escribe en el disco a menos que la presión de memoria lo requiera.

Si t o b no se da en mode, el modo de traducción se define mediante la variable _fmodede modo predeterminado . 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.

Con respecto a T y D:

  • T evita escribir el archivo en disco siempre que la presión de memoria no la requiera. Para obtener más información, vea FILE_ATTRIBUTE_TEMPORARY en Constantes de atributos de archivo y también esta entrada de blog Es solo temporal.
  • D especifica un archivo normal que se escribe en el disco. La diferencia es que se elimina automáticamente cuando se cierra. Puede combinar TD para obtener ambas semánticas.

_fsopen y _wfsopen son variantes específicas de Microsoft de fopen. No forman parte del estándar ANSI. Para una función más portátil y segura, si no necesita compartir archivos, considere _wfopen_s o fopen_s.

El argumento shflag es una expresión constante compuesta por una de las constantes de manifiesto siguientes, que se definen en Share.h.

Término Definición
_SH_DENYNO Permite el acceso de lectura y escritura.
_SH_DENYRD Deniega el acceso de lectura al archivo.
_SH_DENYRW Deniega el acceso de lectura y escritura al archivo.
_SH_DENYWR Deniega el acceso de escritura al archivo.

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
_tfsopen _fsopen _fsopen _wfsopen

Requisitos

Función Encabezado necesario Encabezados opcionales
_fsopen <stdio.h> <share.h>

Para la constante de manifiesto del parámetro shflag.
_wfsopen <stdio.h> o <wchar.h> <share.h>

Para la constante de manifiesto del parámetro shflag.

Ejemplo

// crt_fsopen.c

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

int main( void )
{
   FILE *stream;

   // Open output file for writing. Using _fsopen allows us to
   // ensure that no one else writes to the file while we are
   // writing to it.
    //
   if( (stream = _fsopen( "outfile", "wt", _SH_DENYWR )) != NULL )
   {
      fprintf( stream, "No one else in the network can write "
                       "to this file until we are done.\n" );
      fclose( stream );
   }
   // Now others can write to the file while we read it.
   system( "type outfile" );
}
No one else in the network can write to this file until we are done.

Consulte también

E/S de secuencia
fclose, _fcloseall
_fdopen, _wfdopen
ferror
_fileno
fopen, _wfopen
freopen, _wfreopen
_open, _wopen
_setmode
_sopen, _wsopen