_fdopen
, _wfdopen
Associa um fluxo com um arquivo que foi aberto anteriormente para E/S de nível inferior.
Sintaxe
FILE *_fdopen(
int fd,
const char *mode
);
FILE *_wfdopen(
int fd,
const wchar_t *mode
);
Parâmetros
fd
Descritor de arquivo do arquivo aberto.
mode
Tipo de acesso do arquivo.
Valor retornado
Cada uma dessas funções retorna um ponteiro para o fluxo aberto. Um valor de ponteiro nulo indica um erro. Quando ocorre um erro, o manipulador de parâmetro inválido é invocado, conforme descrito em Validação do parâmetro. Se a execução puder continuar, errno
será definido como EBADF
, que indica um descritor de arquivo inválido ou EINVAL
, que indica que mode
é um ponteiro nulo.
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 _fdopen
associa um fluxo de E/S com o arquivo que é identificado por fd
e, portanto, permite que um arquivo seja aberto para a E/S de nível inferior que será armazenada em buffer e formatada. A função _wfdopen
é uma versão de caractere largo da função _fdopen
; o argumento mode
para _wfdopen
é uma cadeia de caracteres larga. Caso contrário, _wfdopen
e _fdopen
comportam-se de modo idêntico.
Os descritores de arquivo passados para _fdopen
são de propriedade do fluxo FILE *
retornado. Se _fdopen
for bem-sucedido, não chame _close
no descritor de arquivo. Chamar fclose
no FILE *
retornado também fecha o descritor de arquivo.
Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar isso, confira Estado global no CRT.
A cadeia de caracteres mode
especifica o tipo de acesso ao arquivo solicitado para o arquivo:
mode |
Access |
---|---|
"r" |
Abre para leitura. Se o arquivo não existir ou não puder ser encontrado, a chamada fopen 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 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 existir, seus conteúdos são destruídos. |
"a+" |
Abre para leitura e conexão. Cria o arquivo se ele não existir. |
Quando um arquivo é aberto com o tipo de acesso "a"
ou "a+"
, todas as operações de gravação ocorrem no fim do arquivo. O ponteiro de 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 realizada. Assim, os dados existentes não podem ser substituídos. Quando o tipo de acesso "r+"
, "w+"
ou "a+"
é especificado, são permitidas leitura e gravação (diz-se que o arquivo está aberto para "atualização"). No entanto, quando você muda entre leitura e gravação, deve haver uma operação fflush
, fsetpos
, fseek
ou rewind
intermediária. Você poderá especificar a posição atual para a operação fsetpos
ou fseek
, se desejar.
Além dos valores acima, os seguintes caracteres também podem ser incluídos para mode
especificar o modo de conversão para caracteres de nova linha:
Modificador mode |
Comportamento |
---|---|
t |
Abra no modo de texto (convertido). Neste modo, combinações de CR-LF (retorno de carro – avanço de linha) são convertidas em LFs (avanços de uma linha) na entrada e caracteres de LF são convertidos em combinações de CR-LF na saída. Além disso, Ctrl+Z é interpretado como um caractere de fim do arquivo na entrada. |
b |
Abre no modo binário (não convertido). Todas as conversões do modo t são suprimidas. |
c |
Habilite o sinalizador de confirmação para o filename associado de modo que os conteúdos do buffer de arquivo sejam gravados diretamente no disco, se fflush ou _flushall for chamado. |
n |
Redefina o sinalizador de confirmação para o filename como "no-commit". Esse sinalizador é o padrão. Também substitui o sinalizador de confirmação global se você vincular o programa a Commode.obj . O padrão do sinalizador de confirmação global é "no-commit", a menos que você vincule explicitamente seu programa a Commode.obj . |
As t
opções , c
, e n
mode
são extensões da Microsoft para fopen
e _fdopen
. Não os use se quiser preservar a portabilidade ANSI.
Se t
ou b
não for fornecido em mode
, o modo de conversão padrão será definido pela variável global _fmode
. 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.
Caracteres válidos para a cadeia de caracteres mode
usada em fopen
e _fdopen
correspondem aos argumentos oflag
usados em _open
e _sopen
, conforme mostrado nesta tabela:
Caracteres mode na cadeia de caracteres |
Valor oflag equivalente para _open e _sopen |
---|---|
a |
_O_WRONLY | _O_APPEND (geralmente _O_WRONLY | _O_CREAT | _O_APPEND ) |
a+ |
_O_RDWR | _O_APPEND (geralmente _O_RDWR | _O_APPEND | _O_CREAT ) |
r |
_O_RDONLY |
r+ |
_O_RDWR |
w |
_O_WRONLY (geralmente _O_WRONLY | _O_CREAT | _O_TRUNC ) |
w+ |
_O_RDWR (geralmente _O_RDWR | _O_CREAT | _O_TRUNC ) |
b |
_O_BINARY |
t |
_O_TEXT |
c |
Nenhum |
n |
Nenhum |
Requisitos
Função | Cabeçalho necessário | Cabeçalho C++ |
---|---|---|
_fdopen |
<stdio.h> |
<cstdio> |
_wfdopen |
<stdio.h> ou <wchar.h> |
<cstdio> |
Para obter mais informações sobre as convenções de conformidade e de nomenclatura de padrões na biblioteca de runtime C, confira Compatibilidade.
Mapeamentos de rotina de texto genérico
Rotina <tchar.h> |
_UNICODE e _MBCS não definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_tfdopen |
_fdopen |
_fdopen |
_wfdopen |
Exemplo
// crt_fdopen.c
// This program opens a file by using low-level
// I/O, then uses _fdopen to switch to stream
// access. It counts the lines in the file.
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <share.h>
int main( void )
{
FILE *stream;
int fd, count = 0;
char inbuf[128];
// Open a file.
if( _sopen_s( &fd, "crt_fdopen.txt", _O_RDONLY, _SH_DENYNO, 0 ) )
exit( 1 );
// Get stream from file descriptor.
if( (stream = _fdopen( fd, "r" )) == NULL )
exit( 1 );
while( fgets( inbuf, 128, stream ) != NULL )
count++;
// After _fdopen, close by using fclose, not _close.
fclose( stream );
printf( "Lines in file: %d\n", count );
}
Entrada: crt_fdopen.txt
Line one
Line two
Saída
Lines in file: 2
Confira também
E/S de fluxo
_dup
, _dup2
fclose
, _fcloseall
fopen
, _wfopen
freopen
, _wfreopen
_open
, _wopen