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)?
3 réponses
Advanced Programming in Unix Environment
:
...
La différence entre
getc
etfgetc
quegetc
peut être implémenté en macro, alors quefgetc
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 defgetc
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....
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.
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).