_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 _fmode
default-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.
D
Em 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, consulteFILE_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 combinarTD
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