Provengo da uno sfondo C e C++ ma gioco anche con alcune cose del web. Tutti noi C (speriamo) sappiate che chiamare feof
su un FILE*
prima di fare una lettura è un errore. Questo è qualcosa che punge i neofiti a C e C++ molto spesso. Questo è anche il caso dell'implementazione di PHP?Comportamento di feof di PHP rispetto a C
Immagino che deve essere perché il file potrebbe essere una presa o qualsiasi altra cosa in cui è impossibile conoscere la dimensione prima di terminare la lettura. Ma quasi ogni esempio PHP (anche quelli che si trovano sul php.net ho visto simile a questa (e gli allarmi si spengono nella mia testa):
$f = fopen("whatever.txt", "rb");
while(!feof($f)) {
echo fgets($f);
}
fclose($f);
So che è preferibile scrivere questo come questo ed evitare questo problema:
$f = fopen("whatever.txt", "rb");
while($line = fgets($f)) {
echo $line;
}
fclose($f);
ma questo è oltre il punto ho provato il test se le cose sarebbero fallire se l'ho fatto "nel modo sbagliato", ma non ho potuto farlo per causare un comportamento scorretto Questo non è esattamente scientifica,.. ma ho pensato che valesse la pena provare.
Quindi, non è corretto chiamare feof
prima di un fread
in PHP?
Ci sono un paio di modi in cui PHP avrebbe potuto fare diversamente questa versione di C, ma sento che hanno dei svantaggi.
avrebbero potuto impostarlo come predefinito! EOF. Questo è non ottimale perché potrebbe non essere corretto per alcuni casi d'angolo.
potrebbero ottenere la dimensione del file durante una chiamata
fopen
, ma questo non potrebbe funzionare su tutti i tipi di risorse di file, comportando un comportamento incoerente e sarebbe più lento.
Hai creato il tuo account solo per darci questo prezioso contributo? –
in C è sicuramente un errore logico chiamare 'feof' prima di un'operazione che può impostare il flag EOF. 'fopen' non è una di quelle operazioni. –
Arrrggghhh! Non è certamente un errore, logico, sintattico o altro. È perfettamente valido Se capisci cosa fa, si comporterà esattamente come previsto, come spiegato in precedenza da MightyE. La domanda incorniciava la condizione come un errore; non è. – Anonymous