Tout d'abord, il n'y a pas de raison particulièrement bonne d'utiliser fdopen
si fopen
est une option et open
est l'autre choix possible. Vous n'auriez pas dû utiliser open
pour ouvrir le fichier en premier lieu si vous voulez un FILE *
. Donc, y compris fdopen
dans cette liste est incorrecte et déroutante car elle ne ressemble pas beaucoup aux autres. Je vais maintenant continuer à l'ignorer car la distinction importante ici est entre un standard C FILE *
et un descripteur de fichier spécifique au système d'exploitation.
Il y a quatre raisons principales d'utiliser fopen
au lieu de open
.
fopen
vous fournit une mise en mémoire tampon des E/S qui peut s'avérer beaucoup plus rapide que ce que vous faites avecopen
.fopen
fait la traduction de fin de ligne si le fichier n'est pas ouvert en mode binaire, ce qui peut être très utile si votre programme est jamais porté sur un environnement non-Unix (bien que le monde semble converger vers LF uniquement (sauf réseau basé sur le texte IETF protocoles comme SMTP et HTTP et autres)).- Un
FILE *
vous donne la possibilité d'utiliserfscanf
et d'autres fonctions stdio. - Votre code devra peut-être un jour être porté sur une autre plate-forme qui ne prend en charge que le C ANSI et ne prend pas en charge le
open
fonction.
À mon avis, la traduction de fin de ligne vous gêne plus souvent qu'elle ne vous aide, et l'analyse de fscanf
est si faible que vous finissez inévitablement par le jeter au profit de quelque chose de plus utile.
Et la plupart des plates-formes prenant en charge C ont un open
fonction.
Cela laisse la question de la mise en mémoire tampon. Dans les endroits où vous lisez ou écrivez principalement un fichier de manière séquentielle, la prise en charge de la mise en mémoire tampon est vraiment utile et améliore considérablement la vitesse. Mais cela peut entraîner des problèmes intéressants dans lesquels les données ne se retrouvent pas dans le fichier lorsque vous vous attendez à ce qu'elles s'y trouvent. Vous devez vous rappeler de fclose
ou fflush
aux moments opportuns.
Si vous faites des recherches (alias fsetpos
ou fseek
le second est légèrement plus délicat à utiliser de manière conforme aux normes), l'utilité de la mise en mémoire tampon diminue rapidement.
Bien sûr, mon parti pris est que j'ai tendance à travailler beaucoup avec les sockets, et là le fait que vous voulez vraiment faire des E/S non bloquantes (qui FILE *
échoue totalement à prendre en charge de manière raisonnable) sans aucune mise en mémoire tampon et a souvent des exigences d'analyse complexes qui colorent vraiment mes perceptions.
fopen vs open en C
1) fopen
est une fonction de bibliothèque tandis que open
est un appel système .
2) fopen
fournit des E/S tamponnées qui est plus rapide que open
qui est non mis en mémoire tampon .
3) fopen
est portable tandis que open
non portable (ouvert est spécifique à l'environnement ).
4) fopen
renvoie un pointeur vers une structure FILE(FILE *); open
renvoie un entier qui identifie le fichier.
5) Un FILE *
vous donne la possibilité d'utiliser fscanf et d'autres fonctions stdio.
open()
est un appel du système d'exploitation de bas niveau. fdopen()
convertit un descripteur de fichier de niveau os en abstraction FILE de niveau supérieur du langage C. fopen()
appelle le open()
en arrière-plan et vous donne directement un pointeur FILE.
Il y a plusieurs avantages à utiliser des objets FILE plutôt que des descripteurs de fichiers bruts, ce qui inclut une plus grande facilité d'utilisation mais aussi d'autres avantages techniques tels que la mise en mémoire tampon intégrée. En particulier, la mise en mémoire tampon se traduit généralement par un avantage considérable en termes de performances.