Question

Y at-il une raison quelconque (autre que syntaxiques) que vous voudriez 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);

lorsque vous utilisez C dans un environnement Linux?

Était-ce utile?

La solution

Tout d'abord, il n'y a pas particulièrement bonne raison d'utiliser fdopen si fopen est une option et open est l'autre choix possible. Vous ne devriez pas avoir utilisé open pour ouvrir le fichier en premier lieu si vous voulez un FILE *. Donc, y compris fdopen dans cette liste est incorrecte et source de confusion, car il n'y a pas beaucoup comme les autres. Je vais maintenant l'ignorer parce que la distinction importante est ici entre un FILE * standard C et un descripteur de fichier spécifique à l'OS.

Il y a quatre principales raisons d'utiliser fopen au lieu de open.

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

A mon avis, la traduction de fin de ligne plus souvent obtient de votre manière que vous aide, et l'analyse syntaxique de fscanf est si faible que vous finissez inévitablement le jeter en faveur de quelque chose de plus utile.

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

Il reste la question de mise en mémoire tampon. Dans les endroits où vous lisez principalement ou écrire un fichier séquentiellement, le support de mise en mémoire tampon est vraiment utile et une grande amélioration de la vitesse. Mais il peut conduire à des problèmes intéressants dans lesquels des données ne se termine pas dans le fichier lorsque vous vous attendez à être là. Vous devez vous rappeler de fclose ou fflush au moment opportun.

Si vous faites cherche (alias fsetpos ou fseek le second est légèrement plus délicat à utiliser dans un sens conforme aux normes de), l'utilité de mise en mémoire tampon va rapidement vers le bas.

Bien sûr, mon parti pris est que je tends à travailler avec des prises beaucoup, et il y a le fait que vous voulez vraiment faire non bloquante IO (qui FILE * fait totalement défaut à soutenir de quelque façon raisonnable) sans mise en mémoire tampon à tous et ont souvent des exigences d'analyse complexes vraiment colorent mes perceptions.

Autres conseils

open() est un appel os bas niveau. fdopen() convertit un descripteur de fichier au niveau de l'os dans le fichier-abstraction de niveau supérieur de la C la langue. fopen() appelle open() en arrière-plan et vous donne un pointeur de fichier directement.

Il y a plusieurs avantages à utiliser des objets de fichiers plutôt des descripteurs de fichiers bruts, ce qui comprend une plus grande facilité d'utilisation, mais aussi d'autres avantages techniques tels que intégré tampon. En particulier, la mise en mémoire tampon se traduit généralement par un avantage de performance non négligeable.

fopen vs ouverte en C

1) est un fopen fonction de bibliothèque lorsque open est un appel de système .

2) fopen fournit tamponné IO qui est plus rapide à comparer open qui est non tamponnée .

3) fopen est portable lorsque open pas portable ( ouvert est spécifique environnement ).

4) fopen renvoie un pointeur vers une Structure de fichier (FILE *) ; open renvoie un entier qui identifie le fichier.

5) Un FILE * vous donne la possibilité d'utiliser fscanf et d'autres fonctions stdio.

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

Sauf si vous faites partie du 0,1% des applications où l'utilisation open est un avantage de rendement réel, il n'y a vraiment aucune bonne raison de ne pas utiliser fopen. En ce qui concerne fdopen, si vous ne jouez pas avec des descripteurs de fichiers, vous n'avez pas besoin de cet appel.

Stick avec fopen et sa famille de méthodes (fwrite, fread, fprintf, et al) et vous serez très satisfaits. Tout aussi important, d'autres programmeurs seront satisfaits de votre code.

Utilisation ouverte, lecture, écriture signifie que vous avez à vous soucier de interaptions de signal.

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

Alors la bonne façon de fermer un fichier serait

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

open () sera appelé à la fin de chacun des fopen () Fonctions famille. open () est un appel système et fopen () sont fournis par les bibliothèques en tant que fonctions wrapper pour l'utilisateur facile d'utilisation

open() est un appel système et spécifique aux systèmes basés sur Unix et renvoie un descripteur de fichier. Vous pouvez écrire un descripteur de fichier en utilisant write() qui est un autre appel système.
fopen() est un appel de fonction ANSI C qui renvoie un pointeur de fichier, et il est portable vers d'autres systèmes d'exploitation. On peut écrire à un pointeur de fichier en utilisant fprintf.

Dans Unix:
Vous pouvez obtenir un pointeur de fichier à partir du descripteur de fichier en utilisant:

fP = fdopen(fD, "a");

Vous pouvez obtenir un descripteur de fichier à partir du pointeur de fichier en utilisant:

fD = fileno (fP);

Cela dépend aussi de ce que les drapeaux sont tenus d'ouvrir. En ce qui concerne l'utilisation pour l'écriture et la lecture (et la portabilité) f * doit être utilisé, comme expliqué ci-dessus.

Mais si vous voulez essentiellement spécifier plus que les drapeaux standards (comme rw et ajouter des drapeaux), vous devrez utiliser une plate-forme API spécifique (comme POSIX ouvert) ou une bibliothèque qui fait abstraction de ces détails. La norme C n'a pas de ces drapeaux.

Par exemple, vous voudrez peut-être d'ouvrir un fichier, que si elle sort. Si vous ne spécifiez pas le créer indicateur le fichier doit exister. Si vous ajoutez exclusif pour créer, il ne crée le fichier si elle n'existe pas. Il y a beaucoup d'autres.

Par exemple sur les systèmes Linux, il est une interface LED exposée à travers sysfs. Il expose la luminosité du conduit à travers un fichier. L'écriture ou la lecture d'un numéro comme une chaîne allant 0-255. Bien sûr, vous ne voulez pas créer ce fichier et n'écrire si elle existe. Ce qui est cool maintenant. Utilisez fdopen pour lire / écrire ce fichier en utilisant les appels standard

J'ai changé pour ouvrir () à partir fopen () pour ma demande, car fopen était à l'origine lit à double chaque fois que je courais fopen fgetc. Double lit comme suit ont perturbé ce que je voulais accomplir. open () semble faire exactement ce que vous lui demandez.

ouvrir un fichier en utilisant fopen avant de pouvoir lire (ou écrire) des informations de (à) un fichier sur un disque il faut ouvrir le fichier. pour ouvrir le fichier que nous avons appelé la fonction fopen.

1.firstly it searches on the disk the file to be opened.
2.then it loads the file from the disk into a place in memory called buffer.
3.it sets up a character pointer that points to the first character of the buffer.

le mode de comportement de la fonction fopen il y a certaines causes tout en processus de mise en mémoire tampon, il peut TimedOut. donc en comparant fopen (haut niveau i / o) Ouvrir (faible niveau i / o) appel système, et il est plus rapide plus approprié que fopen .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top