Compartir a través de


fopen, _wfopen

Abre un archivo.Versiones más seguras de estas funciones están disponibles; vea fopen_s, _wfopen_s.

FILE *fopen( 
   const char *filename,
   const char *mode 
);
FILE *_wfopen( 
   const wchar_t *filename,
   const wchar_t *mode 
);

Parámetros

  • filename
    Nombre de archivo.

  • mode
    Tipo de acceso que está habilitado.

Valor devuelto

Cada una de estas funciones devuelve un puntero al archivo abierto.Un valor de puntero NULL indica un error.Si filename o mode es NULL o una cadena vacía, estas funciones se inicia el controlador no válido de parámetro, que se describe en Validación de parámetros.Si la ejecución puede continuar, estas funciones NULL return y errno determinado a EINVAL.

Para obtener más información, vea errno, _doserrno, _sys_errlist, y _sys_nerr.

Comentarios

La función de fopen abre el archivo especificado por filename._wfopen es una versión con caracteres anchos de fopen; los argumentos de _wfopen son cadenas de caracteres.Si no, _wfopen y fopen se comportan exactamente igual.Simplemente mediante _wfopen no tiene ningún efecto en el juego de caracteres codificados que se utiliza en la secuencia de archivo.

fopen acepta las rutas que son válidas en el sistema de archivos actualmente la ejecución; fopen acepta las rutas UNC y las rutas que requieren unidades de red asignadas al sistema que se ejecuta el código tenga acceso a la acción o a la unidad asignada en el momento de la ejecución.Cuando se construyen las rutas de fopen, asegúrese de que las unidades, rutas de acceso, o recursos compartidos de red están disponibles en el entorno de ejecución.Puede usar las barras diagonales (/) o barras diagonales inversas (\) como separadores de directorio en una ruta.

Compruebe siempre el valor devuelto para ver si el puntero es NULL antes de realizar cualquier operaciones posterior en el archivo.Si se produce un error, la variable global errno se establece y se puede usar para obtener información específica del error.Para obtener más información, vea errno, _doserrno, _sys_errlist, y _sys_nerr.

Compatibilidad con Unicode

fopen admite secuencias de archivo Unicode.Para abrir un archivo Unicode, pase un indicador de ccs que especifica la codificación deseada a fopen, como sigue.

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

Los valores permitidos de encoding son UNICODE, UTF-8, y UTF-16LE.

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 el archivo es un archivo nuevo.

[!NOTA]

La detección de BOM 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 que se utilizan para los distintos marcadores de ccs especificados en fopen y el orden de bytes marca 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 abiertos para escribir en el modo de Unicode tienen un BOM escritos en automáticamente.

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

Asignaciones de la rutina de Genérico- texto

Rutina de TCHAR.H

_UNICODE y _MBCS no definidos

_MBCS definido

_UNICODE definido

_tfopen

fopen

fopen

_wfopen

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 falla.

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

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

  • "r+"
    Abrir para la lectura y escritura.El archivo 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.No 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 el tipo de acceso 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 desplaza siempre al final del archivo antes de que se realice cualquier operación de escritura.Por consiguiente, los datos existentes no pueden sobrescribirse.

El modo de "a" no quita el marcador EOF antes de que se anexa al archivo.Después de anexar ha producido, el comando VARIANT de MS-DOS solo muestra datos hasta el marcador original EOF y hay datos anexados al archivo.Antes de que se anexa al archivo, el modo de "a+" quita el marcador EOF.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 se abre 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 posición del archivo.Las funciones de posición de archivo son fsetpos, fseek, y rewind.Cuando cambie de escritura a leer, debe utilizar una llamada intermedia a fflush o una función de colocar el archivo.

Además de los valores anteriores, los caracteres siguientes se pueden anexar a 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 interpreta como un carácter EOF en entrada.En los archivos que están abiertos para leer o escribir mediante "a+", fopen comprueba un CTRL+Z al final del archivo y colóquelo, si es posible.Se hace esto porque utilizar fseek y ftell para desplazarse en un archivo que finaliza con CTRL+Z puede hacer fseek para comportarse incorrectamente cerca del final del archivo.

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 de 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
    Especifica el juego de caracteres codificados para utilizar (UTF-8, UTF-16LE, o UNICODE) para este archivo.Deje sin especificar si desea codificación ANSI.

Caracteres válidos para la cadena de mode que se utiliza en fopen y _fdopen corresponde a oflag los argumentos que se usan 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 se tiene que código de puerto, y esperar leer la mayor parte de un archivo grande o no se trata sobre el rendimiento de red, también podría si utilizar la memoria asignada los archivos Win32 como opción.

Requisitos

Función

Encabezado necesario

fopen

<stdio.h>

_wfopen

<stdio.h> o <wchar.h>

Para obtener más información sobre la compatibilidad, vea Compatibilidad.

c, n, t, S, R, T, y las opciones de Dmode son extensiones de Microsoft para fopen y _fdopen y no deben usarse donde desee la portabilidad de ANSI.

Ejemplo

El siguiente programa abra dos archivos.Utiliza fclose para cerrar el primer archivo y _fcloseall a cerrar todos los archivos restantes.

// crt_fopen.c
// compile with: /W3
// 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 )
{
   int numclosed;

   // Open for read (will fail if file "crt_fopen.c" does not exist)
   if( (stream  = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996
   // Note: fopen is deprecated; consider using fopen_s instead
      printf( "The file 'crt_fopen.c' was not opened\n" );
   else
      printf( "The file 'crt_fopen.c' was opened\n" );

   // Open for write 
   if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996
      printf( "The file 'data2' was not opened\n" );
   else
      printf( "The file 'data2' was opened\n" );

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

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

El siguiente programa crea un archivo (o sobrescribe uno si existe), en el modo de texto con codificación Unicode.Escribe dos cadenas en el archivo y cierre el archivo.El resultado es un archivo denominado _wfopen_test.xml, que contiene los datos de la sección de salida.

// crt__wfopen.c
// compile with: /W3
// This program creates a file (or overwrites one if
// it exists), in text mode using Unicode encoding.
// It then writes two strings into the file
// and then closes the file.
 
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <wchar.h>

#define BUFFER_SIZE 50

int main(int argc, char** argv)
{
wchar_t str[BUFFER_SIZE];
size_t  strSize;
FILE*   fileHandle;

    // Create an the xml file in text and Unicode encoding mode.
    if ((fileHandle = _wfopen( L"_wfopen_test.xml",L"wt+,ccs=UNICODE")) == NULL) // C4996
    // Note: _wfopen is deprecated; consider using _wfopen_s instead
    {
        wprintf(L"_wfopen failed!\n");
        return(0);
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"<xmlTag>\n");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!\n");
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"</xmlTag>");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!\n");
    }

    // Close the file.
    if (fclose(fileHandle))
    {
        wprintf(L"fclose failed!\n");
    }
    return 0;
}

Equivalente en .NET Framework

Vea también

Referencia

E/S de la secuencia

Interpretación de secuencias de Multibyte- Carácter

fclose, _fcloseall

_fdopen, _wfdopen

ferror

_fileno

freopen, _wfreopen

_open, _wopen

_setmode

_sopen, _wsopen