Primeiro, não há um motivo particularmente bom para usar fdopen
se fopen
é uma opção e open
é a outra opção possível. Você não deveria ter usado open
para abrir o arquivo em primeiro lugar, se quiser FILE *
. Portanto, incluir fdopen
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 C FILE *
e um descritor de arquivo específico do SO.
Existem quatro razões principais para usar em fopen
vez de open
.
fopen
fornece IO de buffer que pode ser muito mais rápido do que o que você está fazendo open
.
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)).
- A
FILE *
oferece a capacidade de usar fscanf
e outras funções do stdio.
- Algum dia, seu código precisará ser portado para outra plataforma que ofereça suporte apenas ao ANSI C e não à
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 defclose
ou fflush
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.
fdopen
eopen
oufopen
eopen
?