Я знаю тут есть такие кодеры для которых это раз плюнуть. Напишите, пожалуйста. Я бы сам написал, я знаю PHP, но в данном состоянии не могу, а очень нужно в цикле построчно считывать файл с конца. Спасибо.
PHP: <? $tmp=file('file.txt'); $newtmp=array_reverse($tmp); foreach ($newtmp as $value) { echo $value; } ?> Не совсем построчно с конца в цикле. Может так сойдёт...
Самое настоящее чтение с заду на перёд: PHP: <?php class FileReader { var $fp; var $t; function FileReader($file) { $this->fp = fopen($file, 'r'); $this->t = -2; } function Close() { if($this->fp) fclose($this->fp); unset($this); } function Read() { if($this->fp) { $data = fgets($this->fp); $this->t = ftell($this->fp); return $data; } } function ReadC() { if($this->fp) { $data = fgetc($this->fp); $this->t = ftell($this->fp); return $data; } } function ReadBack() { if($this->fp) { if($this->t == -2) { $stat = fstat($this->fp); $this->t = $stat['size'] - 1; unset($stat); } $data = ''; for(; $this->t >= 0; $this->t--) { fseek($this->fp, $this->t); $c = fgetc($this->fp); $data = $c.$data; if($c == "\n") { $this->t--; break; } } return $data; } } function ReadBackC() { if($this->fp) { if($this->t == -2) { $stat = fstat($this->fp); $this->t = $stat['size'] - 1; unset($stat); } fseek($this->fp, $this->t); $data = fgetc($this->fp); return $data; } } function Feof() { return feof($this->fp); } function FeofBack() { return $this->t != -1; } }; $f = new FileReader('md5.php'); while($f->FeofBack()) { echo $f->ReadBack(); echo '<br>'; } $f->Close(); ?>
lukmus зачем? Какая стоит конечная цель? Ну и доп. вопросы - как часто изменяется файл, который так требуется читать? И как часто требуется так издеваться над файловой системой?
эт верно. лучше загружать пачку килобайт и инвертировать, чем читать по одному байту и смещать указатель на каждый символ.
файл изменяется часто (пару раз в минуту). загружать в массив файл и брать с конца - не вариант т.к. файл может быть слишком велик, а мне нужно только N конечных строк в обратном порядке попробую воспользоватся классом WNZRS. всем большое спасибо
дак бери не весь файл а к примеру 4 кбайта, если в них не хватает строк, бери ещё столько же, лишнее обрезать не долго
lukmus вся проблема, что вы ищете решение частной задачи, а не общей. Если вам, например, требуется читать только новые данные из файла, то стоит сохранять текущий размер файла и потом с помощью fseek переходить на эту позицию и от нее читать и инвертировать файл. Если же это некий лог, который только дописывается, и требуется часто читать строго N последних строк, то посмотрите в сторону использования СУБД. Ну а читать побайтово - это насилие над ФС, и лучше читать все же по размеру кластера, а потом php.net/explode
я понил, я вообще дурак, я буду читать файл обычным образом - я буду записывать задом наперед, это гораздо легче. Gifts, я бы тоже хотел использовать СУБД, но к сожалению сейчас это не возможно в данной ситуации