getc() vs fgetc() - Quelles sont les principales différences?

partout je vois" c'est pratiquement identique", ou quelque chose de similaire...

le tutoriel de programmation GNU C:

il y a une autre fonction dans la bibliothèque GNU C appelée fgetc. Il est identique à getc à la plupart des égards, sauf que getc est généralement mis en œuvre en tant que fonction macro et est fortement optimisé, donc préférable dans la plupart des situations. (Dans les situations où vous lisez à partir d'une entrée standard, getc est à peu près aussi rapide que fgetc, puisque les humains tapent lentement par rapport à la vitesse à laquelle les ordinateurs peuvent lire leur entrée, mais quand vous lisez à partir d'un flux qui n'est pas produit interactivement par un humain, fgetc est probablement mieux.)

Quelles sont les autres différences? J'ai entendu dire qu'ils ont chacun une implémentation différente (et on peut en utiliser une comme macro) mais, qu'est-ce qui les rend soo différents (ou assez différents) pour qu'ils soient tous les deux dans la bibliothèque Standard C (ou spécification)?

41
demandé sur Joe DF 2013-08-28 10:40:42

3 réponses

Advanced Programming in Unix Environment:

...

La différence entre getc et fgetc que getc peut être implémenté en macro, alors que fgetc ne peut pas être mis en œuvre comme un macro. Cela signifie trois choses:

  • L'argument getc ne devrait pas être une expression avec des effets secondaires.
  • Depuis fgetc est la garantie d'une fonction, nous pouvons prendre son adresse. Cela nous permet de passer l'adresse de fgetc comme argument à une autre fonction.
  • les appels vers fgetc prennent probablement plus de temps que les appels vers getc, comme il prend généralement plus de temps pour appeler une fonction.

...

39
répondu mohit 2013-08-28 06:48:01

Un point qui peut faire une différence - La page de manuel de dit getc() may be implemented as a macro which evaluates stream more than once.

Cela pourrait conduire à un comportement étrange de certains (pas très utile), par exemple:

FILE *my_files[10] = {...}, *f=&my_files[0];
for (i=0; i<10; i++) {
    int c = getc(f++);    // Parameter to getc has side effects!
}

Si getc évalue f++ plus d'une fois, il avance f plus d'une fois par itération. En comparaison, fgetc est Sécuritaire dans de telles situations.

15
répondu ugoren 2013-08-28 07:26:01

il y a essentiellement les mêmes (ou assez similaires pour ne pas déranger). Vous devriez regarder à leur mise en œuvre: GNU libc et MUSL libc sont des implémentations de logiciels libres. Et ils peuvent maintenant être implémentés comme des fonctions inline (qui sont aussi rapides que des macros).

Et je ne dérange pas tant que ça. Dans la vie réelle, l'e/s est principalement limité par le matériel (par exemple le temps d'accès au disque).

2
répondu Basile Starynkevitch 2013-08-28 06:49:25