GNU/Linux >> Tutoriels Linux >  >> Linux

C ouvert vs ouvert

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 .

  1. 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 avec open .
  2. 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)).
  3. Un FILE * vous donne la possibilité d'utiliser fscanf et d'autres fonctions stdio.
  4. 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.


Linux
  1. Comment créer, extraire ou ouvrir un fichier RAR sous Linux ?

  2. Comment ouvrir un fichier .8 avec Man ?

  3. Questions d'entretien Linux :fichiers ouverts / descripteurs de fichiers ouverts

  4. open() en Python ne crée pas de fichier s'il n'existe pas

  5. libaio.so.1 :impossible d'ouvrir le fichier objet partagé

Comment ouvrir des fichiers ISO sur Ubuntu Linux

Comment décompresser (ouvrir) le fichier Gz

Comment ouvrir un fichier sous Linux

Comment changer la limite de fichiers ouverts sous Linux

Comment ouvrir le gestionnaire de fichiers Ubuntu en tant qu'utilisateur root

cp -L vs cp -H