273 votes

C fopen vs ouvert

Est-il une raison (autre que syntaxique) que vous voulez les utiliser

FILE *fdopen(int fd, const char *mode);

ou

FILE *fopen(const char *path, const char *mode);

au lieu de

int open(const char *pathname, int flags, mode_t mode);

lors de l'utilisation de C dans un environnement Linux?

290voto

Omnifarious Points 25666

Il y a quatre raisons principales pour utiliser fopen au lieu de l'ouvrir.

  1. fopen vous offre tampon IO qui peut inverser beaucoup plus rapidement que ce que vous faites avec open.
  2. fopen ne de fin de ligne traduction si le fichier n'est pas ouvert en mode binaire, qui peut être très utile si votre programme est jamais porté à un non-environnement Unix.
  3. Un FILE * vous donne la possibilité d'utiliser fscanf et d'autres fonctions de stdio.
  4. Votre code peut-être un jour besoin d'être porté à une autre plate-forme que prend uniquement en charge la norme ANSI C et ne prend pas en charge l' open fonction.

Dans mon opinion, la fin de ligne traduction plus souvent est dans votre manière de vous aide à, et de l'analyse de fscanf est si faible que vous finissent inévitablement par le jeter en faveur de quelque chose de plus utile.

Et la plupart des plates-formes qui prennent en charge C ont un open fonction.

Ce qui laisse la question de mise en mémoire tampon. Dans les endroits où vous êtes principalement de la lecture ou de l'écriture d'un fichier de façon séquentielle, la mise en mémoire tampon de soutien est très utile et une grande amélioration de la vitesse. Mais elle peut conduire à des problèmes intéressants, dans lesquels les données ne se retrouvent pas dans le fichier lorsque vous prévoyez d'être là. Vous devez penser à l' fclose ou fflush aux moments appropriés.

Si vous êtes en train de faire cherche, l'utilité de la mise en mémoire tampon descend rapidement.

Bien sûr, mon parti pris est que j'ai tendance à travailler avec des sockets beaucoup, et il y a le fait que vous voulez vraiment faire de la non-bloquant IO ( FILE * totalement ne parvient pas à soutenir en aucune façon raisonnable) sans mise en mémoire tampon à tous et ont souvent complexe l'analyse des exigences vraiment la couleur de mes perceptions.

76voto

Emil H Points 24062

open() est un bas niveau de l'os d'appel. fdopen() convertit un os au niveau de descripteur de fichier au plus haut niveau de FILE de l'abstraction du langage C. fopen() des appels open() dans l'arrière-plan et vous donne un pointeur de FICHIER directement.

Il y a plusieurs avantages à l'utilisation de FICHIERS objets plutôt cru descripteurs de fichiers, qui comprend une plus grande facilité d'utilisation, mais aussi d'autres avantages techniques comme la mise en mémoire tampon. En particulier la mise en mémoire tampon en résulte généralement dans un grand avantage en termes de performance.

20voto

user7116 Points 39829

Sauf si vous faites partie des 0,1% des applications où l'utilisation d' open est un réel avantage en matière de performances, il n'y a vraiment aucune bonne raison de ne pas utiliser fopen. Aussi loin que l' fdopen , si vous ne jouez pas avec les descripteurs de fichier, vous n'avez pas besoin de cet appel.

Bâton avec fopen et sa famille de méthodes (frwite, fread, fprintf, et al) et vous serez très satisfait. Tout aussi important, d'autres programmeurs serez satisfait avec votre code.

12voto

dreamlax Points 47152

Si vous avez un FILE *, vous pouvez utiliser des fonctions comme fscanf, fprintf et fgets etc. Si vous venez de le descripteur de fichier, vous avez limité (mais probablement plus rapide) d'entrée et de sortie des routines read, write etc.

8voto

digy Points 398

À l'aide de l'ouvrir, lire, écrire signifie que vous avez à vous soucier de signal interaptions.

Si l'appel a été interrompu par un gestionnaire de signal les fonctions retournent -1 et errno contient EINTR.

Donc le bon moyen de fermer un fichier

while (retval = close(fd), retval == -1 && ernno == EINTR) ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X