Eu quero saber a diferença entre um descritor de arquivo e um ponteiro de arquivo.
Além disso, em que cenário você usaria um em vez do outro?
c
file-descriptor
file-pointer
karthi_ms
fonte
fonte
Respostas:
Um descritor de arquivo é um "identificador" inteiro de baixo nível usado para identificar um arquivo aberto (ou soquete, ou qualquer outro) no nível do kernel, no Linux e em outros sistemas semelhantes ao Unix.
Você passa descritores de arquivo "simples" para chamadas Unix reais, como
read()
,write()
e assim por diante.Um
FILE
ponteiro é uma construção de nível de biblioteca padrão C, usada para representar um arquivo. OFILE
encapsula o descritor de arquivo e adiciona buffering e outros recursos para tornar o I / O mais fácil.Você passa
FILE
ponteiros para funções C padrão, comofread()
efwrite()
.fonte
fd
é o primeiro argumento pararead()
. Por que você chama isso de pelado?FILE *
tipo da biblioteca padrão , o descritor de arquivo inteiro é "menos empacotado", ou seja, "nu".Um está armazenado em buffer (
FILE *
) e o outro não. Na prática, você deseja usarFILE *
quase sempre quando estiver lendo um arquivo 'real' (ou seja, na unidade), a menos que saiba o que está fazendo ou que o arquivo seja realmente um soquete ou algo assim.Você pode obter o descritor de arquivo
FILE *
usandofileno()
e pode abrir um bufferFILE *
de um descritor de arquivo usandofdopen()
fonte
Um descritor de arquivo é apenas um inteiro que você obtém da
open()
chamada POSIX . Usando o C padrão,fopen()
você obtém umaFILE
estrutura de volta. AFILE
estrutura contém este descritor de arquivo, entre outras coisas, como fim de arquivo e indicador de erro, posição do fluxo, etc.Portanto, o uso
fopen()
oferece uma certa abstração em comparação comopen()
. Em geral, você deve usar,fopen()
já que é mais portátil e você pode usar todas as outras funções C padrão que usam aFILE
estrutura, ou seja,fprintf()
e família.Não há problemas de desempenho usando qualquer um.
fonte
Descritor de arquivo vs ponteiro de arquivo
Descritor de arquivo:
Descritor de arquivo é um valor inteiro retornado pela
open()
chamada do sistema.int fd = open (filePath, mode);
Ponteiro de arquivo:
File Pointer é um ponteiro para uma estrutura C retornada pela
fopen()
função de biblioteca, que é usada para identificar um arquivo, envolver o descritor de arquivo, a funcionalidade de buffer e todas as outras funcionalidades necessárias para a operação de E / S. O ponteiro de arquivo é do tipo FILE , cuja definição pode ser encontrado em "/usr/include/stdio.h" . Esta definição pode variar de um compilador para outro.fonte
Deseja adicionar pontos que podem ser úteis.
SOBRE
FILE *
Eu o uso muitas vezes para logs de depuração. exemplo,
SOBRE
FILE DESCRIPTOR
Geralmente é usado para IPC.
Fornece controle de baixo nível para arquivos em sistemas * nix. (Dispositivos, arquivos, soquetes, etc), portanto, mais poderoso que o
FILE *
.fonte
fdopen()
para fazer coisas como IPC e dispositivos comFILE*
?FILE*
, mas pode criar um aFILE*
partir de um descritor de arquivo (fdopen()
) e, posteriormente, fechar oFILE
irá fechar o descritor também. Portanto, você pode fazer IPC, mas terá que lidar um pouco com os descritores de arquivo para facilitar qualquer IPC direto.FILE *
é mais útil quando você trabalha com arquivos de texto e entrada do usuário / saída, porque ele permite que você use funções da API, comosprintf()
,sscanf()
,fgets()
,feof()
etc.A API do descritor de arquivo é de baixo nível, portanto, permite trabalhar com sockets, pipes, arquivos mapeados na memória (e arquivos regulares, é claro).
fonte
Apenas uma nota para encerrar a discussão (se estiver interessado) ....
fopen
pode ser inseguro e você provavelmente deve usarfopen_s
ouopen
com bits exclusivos definidos. C1X está oferecendox
modos, assim você podefopen
com os modos"rx"
,"wx"
, etc.Se você usar
open
, você pode consideraropen(..., O_EXCL | O_RDONLY,... )
ouopen(..., O_CREAT | O_EXCL | O_WRONLY,... )
.Veja, por exemplo, Não faça suposições sobre fopen () e criação de arquivo .
fonte
fopen_s
não parece estar disponível comPOSIX
, suponho que o soultion mais portátil seria paraopen(2)
e entãofdopen(2)
. (deixando as janelas de lado). Além disso, o que seria mais rápidofopen_s()
ouopen(2)
seguido porfdopen(2)
?As chamadas do sistema usam principalmente o descritor de arquivo, por exemplo
read
ewrite
. A função de biblioteca usará os ponteiros de arquivo (printf
,scanf
). Porém, as funções da biblioteca estão usando apenas chamadas do sistema internamente.fonte
Encontrei um bom recurso aqui , dando uma visão geral de alto nível das diferenças entre os dois:
fonte