Я родом из C и C++, но также играю с некоторыми веб-материалами. Все мы, люди (надеюсь) знаем, что вызов feof
на FILE*
перед выполнением чтения является ошибкой. Это то, что часто забивает новичков на C и C++. Это также относится к реализации PHP?Поведение фейсов PHP по сравнению с C
Я полагаю, что это должно быть потому, что файл может быть сокетом или чем-либо еще, где невозможно узнать размер до окончания чтения. Но почти каждый пример PHP (даже те, что на php.net я видел выглядит примерно так (и сигналы тревоги уходят в моей голове):
$f = fopen("whatever.txt", "rb");
while(!feof($f)) {
echo fgets($f);
}
fclose($f);
Я знаю, что предпочтительнее, чтобы написать это, как это и избежать этого вопрос:
$f = fopen("whatever.txt", "rb");
while($line = fgets($f)) {
echo $line;
}
fclose($f);
но это, кроме точки я пытался тестирование, если все будет работать, если я сделал это «неправильный путь», но я не мог заставить его вызвать неправильное поведение Это не совсем научное,.. но я решил, что стоит попробовать.
Итак, неправильно ли звонить feof
перед fread
в PHP?
Существует несколько способов, которыми PHP мог бы сделать это по-другому, чем версия C, но я чувствую, что у них есть недостатки.
они могут иметь это значение по умолчанию! EOF. Это неоптимально, потому что это может быть некорректно для некоторых угловых случаев.
они могут получить размер файла во время вызова
fopen
, но это не может работать на всех типах файловых ресурсов, что приводит к несовместимому поведению и будет медленнее.
Вы создали свой аккаунт, чтобы дать нам этот ценный вклад? –
в C это, безусловно, логическая ошибка для вызова 'feof' перед операцией, которая может установить флаг EOF. 'fopen' не является одной из этих операций. –
Arrrggghhh! Это, безусловно, не ошибка, логика, синтаксическая или иная. Это совершенно верно. Если вы понимаете, что он делает - он будет вести себя точно так, как ожидалось, как объяснил MightyE выше. Вопрос сформулировал условие как ошибку; это не. – Anonymous