Partilhar via


_fsopen, _wfsopen

Abre um fluxo com compartilhamento de arquivos.

Sintaxe

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
Nome do ficheiro a abrir.

mode
Tipo de acesso permitido.

shflag
Tipo de partilha permitida.

Valor de retorno

Cada uma dessas funções retorna um ponteiro para o fluxo. Um valor de ponteiro nulo indica um erro. Se filename for ou mode for NULL uma cadeia de caracteres vazia, essas funções invocarão o manipulador de parâmetros inválido, conforme descrito em Validação de parâmetros. Se a execução for permitida para continuar, essas funções retornarão NULL e definirão errno como EINVAL.

Para obter mais informações sobre esses e outros códigos de erro, consulte errno, _doserrno, _sys_errliste _sys_nerr.

Observações

A _fsopen função abre o arquivo especificado por filename como um fluxo e prepara o arquivo para leitura ou gravação compartilhada subsequente, conforme definido pelo modo e shflag argumentos. _wfsopené uma versão de caracteres largos de ; os _fsopen e argumentos para filename são cadeias de mode_wfsopen caracteres largos. _wfsopen e _fsopen comportar-se de forma idêntica de outra forma.

A cadeia de caracteres mode especifica o tipo de acesso solicitado para o arquivo, conforme mostrado na tabela a seguir.

Período Definição
"r" Abre para leitura. Se o arquivo não existir ou não puder ser encontrado, a chamada _fsopen falhará.
"w" Abre um arquivo vazio para gravação. Se o ficheiro fornecido existir, o seu conteúdo é destruído.
"a" Abre para escrita no final do ficheiro (anexar); Cria o arquivo primeiro se ele não existir.
"r+" Abre tanto para leitura como para escrita. (O arquivo deve existir.)
"w+" Abre um arquivo vazio para leitura e gravação. Se o ficheiro fornecido existir, o seu conteúdo é destruído.
"a+" Abre para leitura e anexo; Cria o arquivo primeiro se ele não existir.

Use os tipos "w" e "w+" com cuidado, pois eles podem destruir arquivos existentes.

Quando um arquivo é aberto com o tipo de acesso "a" ou "a+", todas as operações de gravação ocorrem no final do arquivo. O ponteiro do arquivo pode ser reposicionado usando fseek ou rewind, mas sempre é movido de volta para o final do arquivo antes de qualquer operação de gravação ser executada. Assim, os dados existentes não podem ser substituídos. Quando o tipo de acesso "r+", "w+"" ou "a+" é especificado, tanto a leitura quanto a gravação são permitidas (diz-se que o arquivo está aberto para atualização). No entanto, ao alternar entre a leitura e a escrita, deve haver uma intervenção fsetpos, fseekou rewind operação. A posição atual pode ser especificada para a fsetpos operação ou fseek , se desejado. Além dos valores acima, um dos seguintes caracteres pode ser incluído para mode especificar o modo de tradução para novas linhas e para gerenciamento de arquivos.

Período Definição
t Abre um ficheiro no modo de texto (traduzido). Neste modo, as combinações de alimentação de linha de retorno de carro (CR-LF) são traduzidas em alimentações de linha única (LF) na entrada e os caracteres LF são traduzidos para combinações de CR-LF na saída. Além disso, CTRL+Z é interpretado como um caractere de fim de arquivo na entrada. Em arquivos abertos para leitura ou leitura/gravação, _fsopen verifica se há uma CTRL+Z no final do arquivo e o remove, se possível. Ele é removido porque usar fseek e ftell mover dentro de um arquivo que termina com uma CTRL+Z pode fazer com fseek que se comporte incorretamente perto do final do arquivo.
b Abre um ficheiro no modo binário (não traduzido); as traduções acima são suprimidas.
D Especifica um arquivo temporário que é excluído quando o último ponteiro de arquivo para ele é fechado.
R Especifica que o cache é otimizado para, mas não restrito a, acesso aleatório do disco.
S Especifica que o cache é otimizado para, mas não restrito a, acesso sequencial do disco.
T Especifica um arquivo que não é gravado no disco, a menos que a pressão da memória o exija.

Se t ou b não for fornecido no mode, o modo de tradução é definido pela variável _fmodede modo padrão . Se t ou b estiver prefixado ao argumento, a função falhará e retornará NULL. Para uma discussão sobre texto e modos binários, consulte E/S de arquivo de texto e modo binário.

Relativamente à T e D:

  • T evita gravar o arquivo no disco, desde que a pressão da memória não exija. Para obter mais informações, consulte FILE_ATTRIBUTE_TEMPORARY em constantes de atributo Filee também esta postagem de blog É apenas temporário.
  • D especifica um arquivo regular que é gravado no disco. A diferença é que ele é excluído automaticamente quando é fechado. Você pode combinar TD para obter ambas as semânticas.

_fsopen e _wfsopen são variantes específicas da Microsoft do fopen. Eles não fazem parte do padrão ANSI. Para uma função mais portátil e segura, se você não precisar de compartilhamento de arquivos, considere _wfopen_s ou fopen_s.

O argumento shflag é uma expressão constante que consiste em uma das seguintes constantes manifestas, definidas em Share.h.

Período Definição
_SH_DENYNO Permite acesso de leitura e gravação.
_SH_DENYRD Nega acesso de leitura ao arquivo.
_SH_DENYRW Nega acesso de leitura e gravação ao arquivo.
_SH_DENYWR Nega acesso de gravação ao arquivo.

Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, consulte Estado global na CRT.

Mapeamentos de rotina de texto genérico

Tchar.h rotina _UNICODE e _MBCS não definidos _MBCS definido _UNICODE definido
_tfsopen _fsopen _fsopen _wfsopen

Requerimentos

Função Cabeçalho obrigatório Cabeçalhos opcionais
_fsopen <stdio.h> <share.h>

Para constante de manifesto para shflag parâmetro.
_wfsopen <stdio.h> ou <wchar.h> <share.h>

Para constante de manifesto para shflag parâmetro.

Exemplo

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

Ver também

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