_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 arquivo a ser aberto.

mode
Tipo de acesso permitido.

shflag
Tipo de compartilhamento permitido.

Valor retornado

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

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

Comentários

A função _fsopen abre o arquivo especificado por filename como um fluxo e prepara o arquivo para leitura ou gravação compartilhada posterior, conforme definido pelo modo e pelos argumentos de shflag. _wfsopen é uma versão de caractere largo de _fsopen; os argumentos filename e mode para _wfsopen são cadeias de caracteres largos. Caso contrário, _wfsopen e _fsopen se comportam de forma idêntica.

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

Termo 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 arquivo determinado existir, seus conteúdos são destruídos.
"a" Abre para gravação no final do arquivo (anexando); cria o arquivo primeiro se ele não existir.
"r+" Abre para leitura e gravação. (O arquivo deve existir.)
"w+" Abre um arquivo vazio para leitura e gravação. Se o arquivo determinado existir, seus conteúdos são destruídos.
"a+" Abre para leitura e anexação; cria o arquivo primeiro se ele não existir.

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

Quando um arquivo for aberto com o tipo de acesso "a" ou "a+", todas as operações de gravação ocorrerão 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 que qualquer operação de gravação seja executada. Portanto, os dados existentes não podem ser substituídos. Quando o tipo de acesso "r+", "w+" ou "a+" for especificado, tanto a leitura quanto a gravação serão permitidas (nesse caso, diz-se que o arquivo está aberto para atualização). No entanto, ao alternar entre leitura e gravação, deverá haver uma operação fsetpos, fseek ou rewind. A posição atual pode ser especificada para a operação fsetpos ou fseek, se desejado. Além dos valores acima, um dos caracteres seguintes pode ser incluído em mode para especificar o modo de conversão para novas linhas e para o gerenciamento de arquivo.

Termo Definição
t Abre um arquivo no modo de texto (convertido). Nesse modo, as combinações CR-LF (alimentação de linha de retorno de carro) são convertidas em LF (alimentações de linha) única na entrada e os caracteres LF são convertidos em combinações CR-LF na saída. Além disso, CTRL+Z é interpretado como um caractere de fim do arquivo na entrada. Em arquivos abertos para leitura ou leitura/gravação, _fsopen verifica se há um CTRL+Z no fim do arquivo e o remove, se possível. Ele é removido porque usar fseek e mover dentro de um arquivo que termina com CTRL+Z pode fazer com fseek que você se comporte ftell incorretamente perto do final do arquivo.
b Abre um arquivo no modo binário (não convertido); as conversõ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 acesso aleatório do disco, mas não se restringe a isso.
S Especifica que o cache é otimizado para acesso sequencial do disco, mas não se restringe a isso.
T Especifica um arquivo que não é gravado no disco, a menos que a pressão da memória o exija.

Se t for ou b não fornecido em mode, o modo de tradução é definido pela variável _fmodedefault-mode . Se t ou b for prefixado para o argumento, a função falha e retorna NULL. Para saber mais sobre os modos de texto e binário, consulte E/S de texto e arquivo de modo binário.

DEm relação e T :

  • T evita gravar o arquivo no disco, desde que a pressão da memória não exija isso. Para obter mais informações, consulte FILE_ATTRIBUTE_TEMPORARY em Constantes de atributo de arquivo e também esta postagem no 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 de manifesto, definidas em Share.h.

Termo 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, confira Estado global no CRT.

Mapeamentos de rotina de texto genérico

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

Requisitos

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

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

Para ver a constante de manifesto para o parâmetro shflag.

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.

Confira também

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