sintaxis - que es fgetc en c
getc() vs fgetc()-¿Cuáles son las principales diferencias? (3)
En todas partes veo "es prácticamente idéntico", o algo similar ...
Del tutorial de programación de GNU C :
Hay otra función en la biblioteca GNU C llamada fgetc. Es idéntico a getc en la mayoría de los aspectos, excepto que getc generalmente se implementa como una función macro y está altamente optimizado, por lo que es preferible en la mayoría de las situaciones. (En situaciones en las que lee datos de entrada estándar, getc es tan rápido como fgetc, ya que los humanos escriben lentamente en comparación con la rapidez con que las computadoras pueden leer sus entradas, pero cuando lee de una secuencia que no es producida interactivamente por un humano, fgetc es probablemente mejor).
¿Cuáles son las otras diferencias? He oído que cada uno tiene una implementación diferente (y uno puede usarse como macro) pero, ¿qué los hace tan diferentes (o lo suficientemente diferentes) para que ambos estén en la biblioteca (o especificación) estándar C?
De la Advanced Programming in Unix Environment
:
...
La diferencia entre
getc
yfgetc
es quegetc
se puede implementar como una macro, mientras quefgetc
no se puede implementar como una macro. Esto significa tres cosas:
- El argumento de
getc
no debe ser una expresión con efectos secundarios.- Como se garantiza que
fgetc
es una función, podemos tomar su dirección. Esto nos permite pasar la dirección defgetc
como argumento a otra función.- Las llamadas a fgetc probablemente tarden más que las llamadas a
getc
, ya que generalmente lleva más tiempo llamar a una función....
En esencia, son lo mismo (o lo suficientemente similares como para no molestar). Debería ver su implementación: GNU libc y MUSL libc son implementaciones de software libre. Y ahora podrían implementarse como funciones en línea (que son tan rápidas como las macros).
Y no me molestaré tanto. En la vida real, la E / S está mayormente limitada por el hardware (por ejemplo, el tiempo de acceso al disco).
Parece que las diferencias son, en el 99.9% de los casos, insignificantes.
Un punto que puede marcar la diferencia: la página man dice que getc() may be implemented as a macro which evaluates stream more than once
.
Podría llevar a un comportamiento extraño en algunos casos (no muy útiles), por ejemplo:
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
evalúa f++
más de una vez, avanzará f
más de una vez por iteración. En comparación, fgetc
es seguro en tales situaciones.