fopen_s, _wfopen_s

Abre un archivo.Estas versiones de fopen, _wfopen tienen mejoras de seguridad, como se describe en Características de seguridad en CRT.

errno_t fopen_s( 
   FILE** pFile,
   const char *filename,
   const char *mode 
);
errno_t _wfopen_s(
   FILE** pFile,
   const wchar_t *filename,
   const wchar_t *mode 
);

Parámetros

  • [out] pFile
    Un puntero al puntero de archivo que recibirá el puntero al archivo abierto.

  • [in] filename
    Nombre de archivo.

  • [in] mode
    Tipo de acceso permitido.

Valor devuelto

Cero si correctamente; un código de error del error.Vea errno, _doserrno, _sys_errlist, y _sys_nerr para obtener más información sobre estos códigos de error.

Condiciones de error

pFile

filename

mode

Valor devuelto

Contenido de pFile

NULL

any

any

EINVAL

sin cambios

any

NULL

any

EINVAL

sin cambios

any

any

NULL

EINVAL

sin cambios

Comentarios

Los archivos que están abiertos por fopen_s y _wfopen_s no son compartibles.Si necesita que un archivo es compartible, utilice _fsopen, _wfsopen con el modo compartido adecuado constante- para el ejemplo, _SH_DENYNO para el uso compartido de lectura y escritura.

La función de fopen_s abre el archivo especificado por filename._wfopen_s es una versión con caracteres anchos de fopen_s; los argumentos de _wfopen_s son cadenas de caracteres._wfopen_s y fopen_s se comportan exactamente igual de otra manera.

fopen_s acepta las rutas que son válidas en el sistema de archivos actualmente la ejecución; Las rutas UNC y las rutas que requieren unidades de red asignadas son aceptadas por fopen_s mientras el sistema que se está ejecutando el código tenga acceso a la acción o a la unidad de red asignada en el momento de la ejecución.Cuando se construyen las rutas de fopen_s, no cree suposiciones acerca de la disponibilidad de unidades, de rutas, o de recursos compartidos de red en el entorno de ejecución.Puede usar las barras diagonales (/) o barras diagonales inversas (\) como separadores de directorio en una ruta.

Estas funciones validan sus parámetros.Si pFile, filename, o mode es un puntero NULL, estas funciones generan una excepción no válida del parámetro, como se describe en Validación de parámetros.

Compruebe siempre el valor devuelto para ver si la función se realizó correctamente antes de realizar cualquier operaciones posterior en el archivo.Si se produce un error, se devuelve el código de error y se establece la variable global errno.Para obtener más información, vea errno, _doserrno, _sys_errlist, y _sys_nerr.

Compatibilidad con Unicode

fopen_s admite secuencias de archivo Unicode.Para abrir un nuevo o existente archivo Unicode, pasa un indicador de ccs que especifica la codificación deseada a fopen_s:

fopen_s(&fp, "newfile.txt", "rw, ccs=encoding");

Los valores permitidos de encoding son UNICODE, UTF-8, y UTF-16LE.Si que no se especifica ningún valor para encoding, fopen_s utiliza codificación ANSI.

Si el archivo existe y está abierto para lectura o anexar, la marca (BOM) de orden de bytes, si está presente en el archivo, determina la codificación.Codificación de BOM tiene prioridad sobre la codificación especificada por el indicador de ccs.La codificación de ccs sólo se usa cuando no hay BOM presente o si el archivo es un archivo nuevo.

[!NOTA]

La BOM- detección sólo se aplica a los archivos que se abren en modo de Unicode; es decir, pasando el indicador de ccs.

La tabla siguiente se resumen los modos para varios marcadores de ccs que se proporcionan a fopen_s y para el orden de bytes marcan en el archivo.

Codificaciones utilizadas basadas en el indicador de los ccs y BOM

Marca de ccs

Ningún BOM (o nuevo archivo)

BOM: UTF-8

BOM: UTF-16

UNICODE

UTF-16LE

UTF-8

UTF-16LE

UTF-8

UTF-8

UTF-8

UTF-16LE

UTF-16LE

UTF-16LE

UTF-8

UTF-16LE

Los archivos que están abiertos para escribir en el modo de Unicode tienen un BOM escritos en automáticamente.

Si mode es “a, ccs=<encoding>”, fopen_s primero intenta abrir el archivo con acceso de lectura y acceso de escritura.Si es correcta, la función lee el BOM para determinar la codificación del archivo; si no es correcta, la función utiliza la codificación predeterminada del archivo.En cualquier caso, fopen_s después abra de nuevo el archivo con acceso de sólo escritura.(Esto se aplica al modo de a sólo, no a+.)

Asignaciones de la rutina de Genérico- texto

Rutina de TCHAR.H

_UNICODE y _MBCS no definidos

_MBCS definido

_UNICODE definido

_tfopen_s

fopen_s

fopen_s

_wfopen_s

Cadena de caracteres mode especifica el tipo de acceso que se solicite para el archivo, como sigue.

  • "r"
    Abrir para leer.Si el archivo no existe o no se encuentra, la llamada de fopen_s falla.

  • "w"
    Abra un archivo vacío para escribir.Si existe el archivo, se destruyen su contenido.

  • "a"
    Abrir para escribir al final del archivo (el anexar) sin quitar el marcador EOF antes de escribir nuevos datos al archivo.Crea el archivo si no existe.

  • "r+"
    Abrir para la lectura y escritura.(El archivo no debe existir.)

  • "w+"
    Abra un archivo vacío para la lectura y escritura.Si existe el archivo, se destruyen su contenido.

  • "a+"
    Abrir para leer y anexar.La operación que anexa incluye la eliminación del marcador EOF antes de que los nuevos datos se escribe en el archivo y se restablece el marcador EOF después de que se complete la escritura.Crea el archivo si no existe.

Si se abre mediante el tipo de acceso de "a" o de "a+", todas las operaciones de escritura aparecen al final del archivo.El puntero de archivo se puede mover mediante fseek o rewind, pero se mueve siempre al final del archivo antes de que se realice cualquier operación de escritura que no pueda sobrescribir los datos existentes.

El modo de "a" no quita el marcador EOF antes de anexar al archivo.Después de anexar ha producido, el comando VARIANT de MS-DOS solo muestra datos hasta el marcador original EOF y no ningún dato que se anexa al archivo.El modo de "a+" quita el marcador EOF antes de anexar al archivo.Después de anexar, el comando VARIANT de MS-DOS muestra todos los datos del archivo.Requieren el modo de "a+" para anexar a un archivo de la secuencia que se terminan con el marcador de CTRL+Z EOF.

Cuando se especifica "r+","w+", o el tipo de acceso de "a+", se permiten la lectura y escritura.(El archivo no se abierto para “update”). Sin embargo, cuando cambie de lectura a la escritura, la operación de entrada debe encontrar un marcador EOF.Si no hay EOF, debe utilizar una llamada intermedia a una función de archivo (el archivo posición.Las funciones de archivo (el archivo posición son fsetpos, fseek, y rewind.Cuando cambie de escritura a leer, debe utilizar una llamada intermedia a fflush o una función de archivo (el archivo posición.

Además de los valores anteriores, los caracteres siguientes se pueden incluir en mode para especificar el de modalidad de traducción por caracteres de nueva línea:

  • t
    Abra en modo de texto (traducido).En este modo, CTRL+Z se interpretan como un final de archivo de entrada.En archivos abierto para leer o escribir con "a+", comprobaciones de fopen_s un CTRL+Z al final del archivo y colóquelo, si es posible.Se hace esto porque utiliza fseek y ftell para desplazarse en un archivo que finaliza con un CTRL+Z, puede hacer fseek para comportarse incorrectamente cerca del final del archivo.

Asimismo, en modo de texto, las combinaciones de retorno- avance de línea de carro se convierten en únicos avances de línea de entrada, y los caracteres de avance de línea se convierten en combinaciones de retorno- avance de línea de carro en la salida.Cuando una función de E/S de secuencia Unicode funciona en el modo de texto (valor predeterminado), el origen o la secuencia de destino se supone que es una secuencia de caracteres multibyte.Por consiguiente, las funciones de la secuencia- entrada Unicode convierten los caracteres multibyte a caracteres anchos (como si por una llamada a la función de mbtowc ).Por la misma razón, las funciones secuencia- generadas Unicode convierten los caracteres anchos a caracteres multibyte (como si por una llamada a la función de wctomb ).

  • b
    Abra en modo (sin traducir) binario; las conversiones que implican los caracteres de retorno de carro y avance de línea se suprimen.

Si t o b no se proporcione en mode, el de modalidad de traducción predeterminado está definida por la variable global _fmode.Si t o b precedido el argumento, se produce un error en la función y devuelve NULL.

Para obtener más información sobre cómo utilizar los modos del texto y el binario en Unicode y E/S de secuencia multibyte, vea E/S de archivo de texto y el modo binario y E/S de la secuencia de Unicode en modos de texto y binario.

  • c
    Habilite el de confirmación para filename asociado para escribir el contenido del búfer de archivos directamente en el disco si se llama fflush o _flushall.

  • n
    Restaure el de confirmación para filename asociado “ninguno- confirmación.” Activado de forma predeterminada.También invalida la marca global de confirmación si vincula el programa con COMMODE.OBJ.El valor predeterminado global del indicador de confirmación es “ninguno- confirmación” a menos que explícitamente vincule el programa con COMMODE.OBJ (vea Opciones de vínculo).

  • N
    Especifica que el archivo no heredan procesos secundarios.

  • S
    Especifica que almacena en memoria caché se optimiza para, pero no se restringe, acceso secuencial a desde el disco.

  • R
    Especifica que almacena en memoria caché se optimiza para, pero no se restringe, acceso aleatorio a desde el disco.

  • T
    Especifica un archivo como temporal.Si es posible, no se vacía en el disco.

  • D
    Especifica un archivo como temporal.Se elimina cuando se cierra el puntero de archivo pasado.

  • ccs=ENCODING
    Especifique el juego de caracteres codificados para utilizar (UTF-8, UTF-16LE, y UNICODE) para este archivo.Deje este sin especificar si desea codificación ANSI.

Los caracteres válidos para la cadena de mode utilizada en fopen_s y _fdopen corresponden a oflag los argumentos utilizados en _open y _sopen, como sigue.

Caracteres de cadena mode

Valor equivalente de oflag para _open/_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

S

_O_SEQUENTIAL

R

_O_RANDOM

T

_O_SHORTLIVED

D

_O_TEMPORARY

ccs=UNICODE

_O_WTEXT

ccs=UTF-8

_O_UTF8

ccs=UTF-16LE

_O_UTF16

Si usa el modo de rb, no necesita el puerto el código, y espera leer mucho el archivo o no interesen sobre el rendimiento de red, los archivos asignados memoria de Win32 también podrían ser una opción.

Requisitos

Función

Encabezado necesario

fopen_s

<stdio.h>

_wfopen_s

<stdio.h> o <wchar.h>

Para obtener información adicional de compatibilidad, vea Compatibilidad en la Introducción.

Bibliotecas

Todas las versiones de Bibliotecas en tiempo de ejecución de C.

c, n, y las opciones de tmode son extensiones de Microsoft para fopen_s y _fdopen y no deben usarse donde desee la portabilidad de ANSI.

Ejemplo

// crt_fopen_s.c
// This program opens two files. It uses
// fclose to close the first file and
// _fcloseall to close all remaining files.
 

#include <stdio.h>

FILE *stream, *stream2;

int main( void )
{
   errno_t err;

   // Open for read (will fail if file "crt_fopen_s.c" does not exist)
   err  = fopen_s( &stream, "crt_fopen_s.c", "r" );
   if( err == 0 )
   {
      printf( "The file 'crt_fopen_s.c' was opened\n" );
   }
   else
   {
      printf( "The file 'crt_fopen_s.c' was not opened\n" );
   }

   // Open for write 
   err = fopen_s( &stream2, "data2", "w+" );
   if( err == 0 )
   {
      printf( "The file 'data2' was opened\n" );
   }
   else
   {
      printf( "The file 'data2' was not opened\n" );
   }

   // Close stream if it is not NULL 
   if( stream )
   {
      err = fclose( stream );
      if ( err == 0 )
      {
         printf( "The file 'crt_fopen_s.c' was closed\n" );
      }
      else
      {
         printf( "The file 'crt_fopen_s.c' was not closed\n" );
      }
   }

   // All other files are closed:
   int numclosed = _fcloseall( );
   printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}
  

Equivalente en .NET Framework

Vea también

Referencia

E/S de la secuencia

fclose, _fcloseall

_fdopen, _wfdopen

ferror

_fileno

freopen, _wfreopen

_open, _wopen

_setmode