Vengo de un fondo de C y C++ pero también juego con algunas cosas de la web. Todos nosotros, la gente de C (con suerte) sabemos que llamar al feof
en un FILE*
antes de leer es un error. Esto es algo que pica a los novatos en C y C++ con mucha frecuencia. ¿Es este también el caso de la implementación de PHP?Comportamiento de feof de PHP contra C
Me imagino que tiene que ser porque el archivo podría ser un zócalo o cualquier otra cosa donde es imposible saber el tamaño antes de terminar de leer. Pero casi todos los ejemplos de PHP (incluso las que se encuentran en php.net que he visto se ve algo como esto (y las alarmas se apagan en mi cabeza):
$f = fopen("whatever.txt", "rb");
while(!feof($f)) {
echo fgets($f);
}
fclose($f);
Sé que es preferible escribir esto como esto y evitar esta tema:
$f = fopen("whatever.txt", "rb");
while($line = fgets($f)) {
echo $line;
}
fclose($f);
pero eso es además el punto probé la prueba si las cosas fallarían si lo hacía "por el camino equivocado", pero no podía conseguirlo para causar un comportamiento incorrecto Esto no es exactamente científica,.. pero pensé que valía la pena intentarlo.
Entonces, ¿es incorrecto llamar al feof
antes de un fread
en PHP?
Hay dos maneras en que PHP podría haber hecho esto de manera diferente a la versión de C, pero creo que tienen inconvenientes.
podrían tenerlo por defecto! EOF. Esto no es óptimo porque puede ser incorrecto para algunos casos de esquina.
podían obtener el tamaño de archivo durante una llamada
fopen
, pero esto no podría funcionar en todos los tipos de recursos de archivos, produciendo un comportamiento incoherente y sería más lento.
¿Creó su cuenta solo para brindarnos esta valiosa contribución? –
en C, sin duda es un error lógico llamar a 'feof' antes de una operación que puede establecer el indicador EOF. 'fopen' no es una de esas operaciones. –
Arrrggghhh! Ciertamente no es un error, lógico, sintáctico o de otro tipo. Es perfectamente válido Si comprende lo que hace, se comportará exactamente como se espera, como explicó MightyE arriba. La pregunta enmarcó la condición como un error; no lo es. – Anonymous