Existe algum motivo (além dos sintáticos) que você gostaria de usar
FILE *fdopen(int fd, const char *mode);
ou
FILE *fopen(const char *path, const char *mode);
ao invés de
int open(const char *pathname, int flags, mode_t mode);
ao usar C em um ambiente Linux?
fdopen
eopen
oufopen
eopen
?fopen
faz parte da biblioteca C padrão,open
não é. Usefopen
ao escrever código portátil.open
seja uma função POSIX.Respostas:
Primeiro, não há um motivo particularmente bom para usar
fdopen
sefopen
é uma opção eopen
é a outra opção possível. Você não deveria ter usadoopen
para abrir o arquivo em primeiro lugar, se quiserFILE *
. Portanto, incluirfdopen
nessa lista é incorreto e confuso porque não é muito parecido com os outros. Agora vou ignorá-lo porque a importante distinção aqui é entre um padrão CFILE *
e um descritor de arquivo específico do SO.Existem quatro razões principais para usar em
fopen
vez deopen
.fopen
fornece IO de buffer que pode ser muito mais rápido do que o que você está fazendoopen
.fopen
faz tradução de final de linha se o arquivo não for aberto no modo binário, o que pode ser muito útil se o seu programa for portado para um ambiente não-Unix (embora o mundo pareça estar convergindo apenas para LF (exceto redes baseadas em texto IETF) protocolos como SMTP e HTTP e outros)).FILE *
oferece a capacidade de usarfscanf
e outras funções do stdio.open
função.Na minha opinião, a tradução de final de linha entra mais frequentemente em seu caminho do que ajuda você, e a análise de
fscanf
é tão fraca que você inevitavelmente acaba jogando fora em favor de algo mais útil.E a maioria das plataformas que suportam C têm um
open
função.Isso deixa a questão do buffer. Nos locais em que você está lendo ou gravando principalmente um arquivo sequencialmente, o suporte ao buffer é realmente útil e uma grande melhoria de velocidade. Mas isso pode levar a alguns problemas interessantes nos quais os dados não acabam no arquivo quando você espera que eles estejam lá. Você tem que lembrar de
fclose
oufflush
nos momentos apropriados.Se você estiver fazendo buscas (aka
fsetpos
oufseek
o segundo é um pouco mais difícil de usar de maneira compatível com os padrões), a utilidade do buffer diminui rapidamente.Obviamente, meu preconceito é que eu tendem a trabalhar muito com soquetes, e existe o fato de que você realmente deseja fazer IO sem bloqueio (que
FILE *
falha totalmente no suporte de qualquer maneira razoável) sem buffer e muitas vezes requisitos complexos de análise realmente colorem minhas percepções.fonte
fgets
,fgetc
,fscanf
,fread
), será sempre ler todo o tamanho do buffer (4K, 8K ou o que você definir). Usando a E / S direta, você pode evitar isso. Nesse caso, é ainda melhor usar empread
vez de um par de busca / leitura (1 syscall em vez de 2).read()
e interrupçõeswrite()
é um quinto motivo conveniente para usar a família de funções libc.ioctl
também suportam afileno
chamada que recebeFILE *
e retorna um número que pode ser usado em umaioctl
chamada. Tenha cuidado, porém.FILE *
chamadas relacionadas podem interagir surpreendentemente com o usoioctl
para alterar algo sobre o descritor de arquivo subjacente.open()
é uma chamada de sistema operacional de baixo nível.fdopen()
converte um descritor de arquivo no nível do sistema operacional para a abstração de ARQUIVO de nível superior da linguagem C.fopen()
chamadasopen()
em segundo plano e fornece um ponteiro FILE diretamente.Existem várias vantagens no uso de objetos FILE, em vez de descritores de arquivos brutos, que incluem maior facilidade de uso, mas também outras vantagens técnicas, como buffer interno. Especialmente, o buffer geralmente resulta em uma vantagem considerável de desempenho.
fonte
fopen()
não fornece o mesmo nível de controle ao abrir arquivos, por exemplo, criar permissões, modos de compartilhamento e muito mais. normalmenteopen()
e variantes proporcionam muito mais controle, perto do que o sistema operacional realmente fornecemmap
arquiva e faz alterações com a E / S normal (por incrível que pareça, no nosso projeto, e por boas razões reais), o buffer estaria no caminho.fopen vs aberto em C
1)
fopen
é uma função de biblioteca enquantoopen
é uma chamada do sistema .2)
fopen
fornece IO em buffer, que é mais rápido em comparação com oopen
que não é em buffer .3)
fopen
é portátil enquantoopen
não portátil ( aberto é específico do ambiente ).4)
fopen
retorna um ponteiro para uma estrutura FILE (FILE *) ;open
retorna um número inteiro que identifica o arquivo.5) A
FILE *
oferece a capacidade de usar o fscanf e outras funções do stdio.fonte
open
é um padrão POSIX, por isso é bastante portátilA menos que você faça parte dos 0,1% de aplicativos em que o uso
open
é um benefício real de desempenho, não há realmente uma boa razão para não usá-lofopen
. No que dizfdopen
respeito, se você não estiver jogando com descritores de arquivo, não precisará dessa chamada.Stick with
fopen
e sua família de métodos (fwrite
,fread
,fprintf
, et al) e você será muito satisfeito. Tão importante quanto isso, outros programadores ficarão satisfeitos com o seu código.fonte
Se você tem um
FILE *
, você pode usar funções comofscanf
,fprintf
efgets
etc. Se você tiver apenas o descritor de arquivo, você tem limitado (mas provavelmente mais rápido) rotinas de entrada e saídaread
,write
etc.fonte
Usar abrir, ler, escrever significa que você precisa se preocupar com interações de sinal.
Se a chamada foi interrompida por um manipulador de sinal, as funções retornam -1 e configuram errno como EINTR.
Portanto, a maneira correta de fechar um arquivo seria
fonte
close
isso depende do sistema operacional. É incorreto executar o loop no Linux, AIX e em outros sistemas operacionais.open()
é uma chamada de sistema e específica para sistemas baseados em Unix e retorna um descritor de arquivo. Você pode gravar em um descritor de arquivo usandowrite()
outra chamada do sistema.fopen()
é uma chamada de função ANSI C que retorna um ponteiro de arquivo e é portátil para outros sistemas operacionais. Podemos escrever para um ponteiro de arquivo usandofprintf
.No Unix:
você pode obter um ponteiro de arquivo no descritor de arquivos usando:
Você pode obter um descritor de arquivo no ponteiro do arquivo usando:
fonte
open () será chamado no final de cada uma das funções da família fopen () . open () é uma chamada do sistema e fopen () são fornecidos pelas bibliotecas, pois um wrapper funciona para facilitar o uso do usuário
fonte
Alterei para open () de fopen () para o meu aplicativo, porque o fopen estava causando leituras duplas toda vez que eu executava o fopen fgetc. Leituras duplas perturbam o que eu estava tentando realizar. open () parece fazer o que você pede.
fonte
Depende também de quais sinalizadores são necessários para abrir. Com relação ao uso para escrita e leitura (e portabilidade), f * deve ser usado, conforme discutido acima.
Mas se basicamente quiser especificar mais do que sinalizadores padrão (como sinalizadores rw e anexar), você precisará usar uma API específica da plataforma (como POSIX aberto) ou uma biblioteca que abstraia esses detalhes. O padrão C não possui nenhum sinalizador.
Por exemplo, você pode querer abrir um arquivo, apenas se ele sair. Se você não especificar o sinalizador de criação, o arquivo deverá existir. Se você adicionar exclusivo para criar, ele criará o arquivo apenas se ele não existir. Existem muitos mais.
Por exemplo, nos sistemas Linux, há uma interface de LED exposta através do sysfs. Ele expõe o brilho do led através de um arquivo. Escrever ou ler um número como uma sequência que varia de 0 a 255. É claro que você não deseja criar esse arquivo e somente gravar se ele existir. O legal agora: use fdopen para ler / gravar este arquivo usando as chamadas padrão.
fonte
Ao abrir um arquivo usando fopen
antes de podermos ler (ou escrever) informações de (para) um arquivo em um disco, devemos abrir o arquivo. para abrir o arquivo, chamamos a função fopen.
este o modo de comportamento da função fopen
existem algumas causas durante o processo de buffer, pode expirar. portanto, ao comparar a chamada do sistema fopen (alto nível de E / S) para abrir (baixo nível de E / S), é mais rápido e apropriado do que o Fopen .
fonte