Это приемлемый способ определения EOF при чтении файла в PHP? - PullRequest
0 голосов
/ 23 июня 2011

Я довольно новичок в PHP и просто пытаюсь преобразовать что-то, что я сделал в C. У меня читали файл для чтения из файла в C:

while ((c = getchar()) != EOF) {
    doSomethingWith(c);
}

Я кое-что прочитали может показаться, что «правильный» способ сделать это в PHP:

while (!feof($file)) {
    $c = fgetc($file);
    doSomethingWith($c);
}

Мой вопрос таков: можно ли объединить эти два следующим образом (я пробовал, и он работает нормально намой тестовый файл), или есть ситуации, когда это может найти ноль перед EOF?:

while (($c = fgets($f)) != null) {
    doSomethingWith($c);
}

Заранее спасибо

Стив

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

Это нормально, но то, как ты это делаешь, неправильно (по крайней мере, «не совсем правильно»). fgets() возвращает false, если достигнут конец файла, поэтому вам следует вместо этого проверить false. Он работает для вас, потому что вы используете «простой» оператор равенства (==), который будет иметь значение от null до false при сравнении с логическим значением.

Возвращает строку длиной до 1 байта, считанную из файла, на который указывает дескриптор. Если в указателе файла больше нет данных для чтения, возвращается FALSE.

Если возникает ошибка, возвращается FALSE.

Это значит, это должно выглядеть как

while (($c = fgets($f)) !== false) {
    doSomethingWith($c);
}
0 голосов
/ 23 июня 2011

fgets задокументировано для возврата false, когда больше нет данных для чтения. Следовательно, технически правильное решение будет

// Notice the !== [non-identical] operator below
while (($c = fgets($f)) !== false) {
    doSomethingWith($c);
}

Это лучше, потому что fgets может законно вернуть пустую (нулевую длину) строку, которая будет сравниваться равной null при использовании оператора равенства. Оператор !== также проверяет тип своих операндов, так что таким образом вы покрыты.

...