Share via


fopen_s, _wfopen_s

em aberto um arquivo.Essas são sistema autônomo versões de fopen, _wfopen com aprimoramentos de segurança conforme descrito em Aprimoramentos de segurança no 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
    Um ponteiro para o ponteiro do arquivo que receberá o ponteiro para o arquivo aberto.

  • [in]filename
    Nome de arquivo.

  • [in]mode
    Tipo de acesso permitido.

Valor de retorno

Zero se for bem-sucedida; um código de erro em caso de falha.See _doserrno, errno, _sys_errlist e _sys_nerr para obter mais informações sobre esses e outros, códigos de erro.

Condições de erro

pFile

filename

mode

Valor de retorno

Contents ofpFile

NULL

any

any

EINVAL

inalterado

any

NULL

any

EINVAL

inalterado

any

any

NULL

EINVAL

inalterado

Comentários

Arquivos abertos por fopen_s e _wfopen_s não é compartilhável. Se você precisar de um arquivo ser compartilhável, use _fsopen, _wfsopen com a constante apropriada de modo de compartilhamento (por exemplo, _SH_DENYNO para o compartilhamento de leitura/gravar).

The fopen_s função abre o arquivo especificado por filename. _wfopen_sé uma versão de caractere largo da fopen_s; os argumentos para _wfopen_ssão seqüências de caracteres largos. _wfopen_s e fopen_s tenham comportamento idêntico caso contrário.

fopen_s aceitará caminhos válido no sistema de arquivos no ponto de execução; caminhos UNC e caminhos de unidades de rede mapeadas envolvendo são aceitos pelo fopen_s sistema autônomo longo sistema autônomo o sistema executando o código h sistema autônomo acesso ao compartilhamento ou unidade de rede mapeada no momento da execução. Especial deve ter cuidado ao construir caminhos de fopen_s Para evitar fazer suposições sobre unidades disponível, caminhos ou rede compartilha no ambiente de execução.

Essas funções validar seus parâmetros.If pFile, modo ou nome de arquivo é um ponteiro nulo, essas funções gerem uma exceção de parâmetro inválido sistema autônomo descrito em Validação de parâmetro.

Sempre verifique o valor retornado para ver se a função bem-sucedida antes de executar quaisquer operações adicionais no arquivo.If an error occurs, the error code is returned and the global variableerrno is set.Para obter mais informações, consulte errno.

In Visual C++ 2005, fopen_s oferece suporte a fluxos de arquivo Unicode. Um sinalizar especificando a codificação desejada pode ser passado para fopen_s Quando abrir um novo arquivo ou substituir um arquivo existente, assim:

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

Valores permitidos do encoding incluir UNICODE, UTF-8, e UTF-16LE. Se o arquivo já está em existência e é aberto para leitura ou acrescentando, Mark ordem de byte (BOM) é usado para determinar a codificação correta.Não é necessário especificar a codificação com um sinalizar.Na verdade, o sinalizar será ignorado se ela está em conflito com o tipo de arquivo sistema autônomo indicado pelo BOM.O sinalizar é usado somente quando nenhum BOM está presente ou se o arquivo é um novo arquivo.A tabela a seguir resume os modos usados para vários sinalizadores para fopen e marcas de ordem byte usado no arquivo.

Codificações usado com base no sinalizar e BOM

Sinalizador

Nenhuma BOM (ou o novo arquivo)

BOM: UTF-8

BOM: UTF-16

UNICODE

ANSI

UTF-8

UTF-16LE

UTF-8

UTF-8

UTF-8

UTF-16LE

UTF-16LE

UTF-16LE

UTF-8

UTF-16LE

If modeé"a, ccs=<encoding>", fopen_s primeiro tentará em em aberto o arquivo com o acesso de leitura e gravar. Se tiver êxito, será exibido o BOM para determinar a codificação deste arquivo; no entanto, se ele falhar, ele usará a codificação padrão para o arquivo.Em ambos os casos, fopen_s será, em seguida, reabra o arquivo com acesso somente gravar. (Isso se aplica a a modo único, não a+.)

Mapeamentos de rotina de texto genérica

Rotina TCHAR.H

_UNICODE & _MBCS não definido

_MBCS definido

_UNICODE definido

_tfopen_s

fopen_s

fopen_s

_wfopen_s

O caractere de seqüência de caracteres mode Especifica o tipo de acesso solicitado para o arquivo, da seguinte maneira:

  • "r"
    Será aberto para leitura.Se o arquivo não existe ou não for encontrado, o fopen_s Chame falhar.

  • "w"
    Abre um arquivo vazio para gravação.Se existir o arquivo fornecido, seu Sumário será destruído.

  • "a"
    É aberto para gravação no participante do arquivo (acrescentar) sem remover o marcador EOF antes de gravar novos dados para o arquivo; cria o arquivo primeiro se ele não existir.

  • "r+"
    Será aberto para leitura e gravação.(O arquivo deve existir).

  • "w+"
    Abre um arquivo vazio para ler e gravar.Se existir o arquivo fornecido, seu Sumário será destruído.

  • "a+"
    Será aberto para leitura e acrescentando; acrescentando operação inclui a remoção do marcador EOF antes que novos dados são gravados no arquivo e o marcador EOF é restaurado após a gravação seja concluído; cria o arquivo primeiro se ele não existir.

Quando um arquivo for aberto com o "a" ou "a+" tipo de acesso gravar todas as operações ocorrem ao participante do arquivo. O ponteiro do arquivo pode ser reposicionado fseek ou rewind, mas é sempre retornado ao participante do arquivo antes de escrever nenhuma operação é executada. Assim, os dados existentes não podem ser substituídos.

The "a" não remove o marcador EOF antes acrescentando o arquivo. Após a ocorrência de acréscimo, o comando MS-DOS TYPE mostra somente dados até o marcador EOF original e não os dados anexados ao arquivo.The "a+" modo irá remover o marcador EOF antes de acrescentá-lo. Após importar, o comando MS-DOS TYPE, mostra todos os dados no arquivo.The "a+" o modo é necessário para acrescentar a um arquivo de fluxo que é encerrado com o marcador EOF CTRL+Z.

When the "r+","w+", or "a+" access type is specified, both reading and writing are allowed (the file is said to be open for "update").No entanto, quando você alterna entre a leitura e gravação, deve haver um intermediárias fflush, fsetpos, fseek, ou rewind operação. A posição corrente pode ser especificada para o fsetpos ou fseek operação, se desejado.

Juntamente com os valores acima, os caracteres a seguir podem ser incluídos em mode Para especificar o modo de tradução de caracteres de nova linha:

  • t
    em em aberto em texto (convertida) modo.Nesse modo, CTRL+Z é interpretado sistema autônomo um caractere de participante de arquivo na entrada.Em arquivos abertos para leitura/gravação com "a+", fopen_s verifica um CTRL+Z no participante do arquivo e remove-lo, se possível. Isso é concluído porque usando fseek e ftell Para mover dentro de um arquivo que termina com um CTRL+Z, podem causar fseek se comporte incorretamente no participante do arquivo.

Além disso, no modo de texto, carro return–linefeed combinações são traduzidas para alimentações de linha única na entrada e caracteres de avanço de linha são convertidos em combinações de return–linefeed carro na saída.Quando uma função de fluxo de E/S Unicode opera no modo de texto (padrão), fonte ou fluxo de destino será considerado uma sequência de caracteres multibyte.Portanto, sistema autônomo funções de fluxo de entrada Unicode converter multibyte caracteres para caracteres largos (sistema autônomo se por uma telefonar para o mbtowc função). Pelo mesmo motivo, sistema autônomo funções de fluxo de saída Unicode convertem caracteres largos caracteres multibyte (sistema autônomo se por uma telefonar para o wctomb função).

  • b
    em em aberto no modo binário (não traduzido); traduções envolvendo caracteres de retorno de carro e avanço de linha são suprimidas.

If t ou b não é fornecido na mode, o modo de tradução padrão é definido pela variável global _fmode.If t ou b tem o prefixo para o argumento, a função falha e retorna NULL.

Para obter mais informações sobre como usar o texto e modos de binários em Unicode e multibyte fluxo de I/O, consulte Texto e o modo binário arquivo I/O and Unicode Stream I/O no texto e modos binários.

  • c
    Ativar o sinalizar de confirmar para o associado filename para que o Sumário do buffer de arquivo é gravado diretamente no disco se qualquer uma fflush ou _flushall é chamado.

  • n
    reiniciar o sinalizar de confirmar para o associado filenamepara "não-confirmar". Este é o padrão.Ela também substitui o sinalizar de confirmar global se você vincular o seu programa com COMMODE.OBJ.O padrão de sinalizar de confirmar global é "não-confirmar", a menos que você explicitamente vincular seu programa com COMMODE.OBJ (consulteOpções de link).

  • N
    Especifica que o arquivo não é herdado pelos processos filhos.

  • S
    Especifica que o cache é otimizado para, mas não restrito a, acesso seqüencial do disco.

  • R
    Especifica que o cache é otimizado para, mas não restrito a, acesso aleatório do disco.

  • T
    Especifica um arquivo sistema autônomo temporário.Se possível, ele não é liberado para o disco.

  • D
    Especifica um arquivo sistema autônomo temporário.Ele é excluído quando o último ponteiro de arquivo é fechado.

  • ccs=ENCODING
    Especificar o conjunto de caractere codificados para usar (ANSI, UTF-8, UTF-16LE e UNICODE) para este arquivo.Essa opção está disponível em Visual C++ 2005 e mais recente.

Caracteres válido para o mode seqüência de caracteres usada na fopen_s e _fdopen corresponde a oflag argumentos usados na _Open and _sopen, sistema autônomo segue.

Caracteres na cadeia de modo

Equivalente oflag valor para _open/_sopen

a

_O_WRONLY | _O_APPEND (usually _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 (usually _O_WRONLY |_O_CREAT | _O_TRUNC)

w+

_O_RDWR (normalmente _O_RDWR | _O_CREAT | _O_TRUNC)

b

_O_BINARY

t

_O_TEXT

c

Nenhum

n

Nenhum

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

Se você estiver usando rb modo, não precisará portar seu código e pretende ler muita o arquivo e/ou não se preocupa com o desempenho da rede, arquivos Win32 de memória mapeada podem ser também uma opção.

Requisitos

Função

Cabeçalho necessário

fopen_s

<stdio.h>

_wfopen_s

<stdio.h> ou <wchar.h>

Para obter informações adicionais compatibilidade, consulte Compatibilidade na introdução.

Bibliotecas

Todas as versões do C em time de execução bibliotecas.

The c, n, and t mode options are Microsoft extensions for fopen_s and _fdopen and should not be used where ANSI portability is desired.

Exemplo

// 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 )
{
   int numclosed;
   errno_t err;

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

   // Open for write 
   if( (err = fopen_s( &stream2, "data2", "w+" )) != 0 )
      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_s.c' was not closed\n" );
      }
   }

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

The file 'crt_fopen_s.c' was opened The file 'data2' was opened Number of files closed by _fcloseall: 1

Equivalente do NET Framework

Consulte também

Referência

Fluxo de E/S

fclose, _fcloseall

_fdopen, _wfdopen

ferror

_fileno

freopen, _wfreopen

_Open, _wopen

_setmode