Как прочитать файл с конца?

Тема в разделе "PHP", создана пользователем artcosmic, 30 окт 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. artcosmic

    artcosmic

    Регистр.:
    16 сен 2008
    Сообщения:
    198
    Симпатии:
    161
    В файле есть строки, например
    Строка 1
    Строка 2
    Строка 3
    Строка 4
    Строка 5
    Нужно вывести на страницу строки наоборот
    Строка 5
    Строка 4
    Строка 3
    Строка 2
    Строка 1
    Вроде бы должно быть нетрудно, но не могу никак разобраться... Помогите, пожалуйста.
     
  2. General Fizz

    General Fizz Боевой Генерал :)

    Регистр.:
    11 апр 2007
    Сообщения:
    753
    Симпатии:
    396
    Читай файл в массив по строкам функцией file, затем пробегай массив убывающим счетчиком от начиная от максимального значения, выводя каждую строку.
     
  3. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    PHP:
    <?php 
    $a
    =file('sokr.txt');
    if(
    preg_match('{\Z.+\z}s'$a[count($a)-1])) 
        echo 
    $a[count($a)-1];
      else
        echo 
    $a[count($a)-1]."\n";    
    for(
    $i=count($a)-20<=$i$i--) {
        echo 
    $a[$i];
    }
    ?>
     
  4. Hemi-Sync

    Hemi-Sync Постоялец

    Регистр.:
    17 дек 2006
    Сообщения:
    88
    Симпатии:
    38
    PHP:
    array_reverse(file('myfile.txt'));
     
    artcosmic нравится это.
  5. shad0w

    shad0w Постоялец

    Регистр.:
    8 июн 2006
    Сообщения:
    95
    Симпатии:
    13
    если файл большой, он просто заполнит всю память и скрипт не отработает. Вот решение, которое реально читает файл с конца (через fseek:(


    <?php
    /************************************************** ***
    ** Title.........: RevFile Class
    ** Version.......: 1.00
    ** Author........: Steve Weet <sweet@weet.demon.co.uk>
    ** Filename......: class.RevFile.php
    ** Last changed..: 30th Jan 2004
    ** Purpose.......: Allows the display of a file in
    ** ..............: In reverse order
    ************************************************** ****/

    // Example Usage
    $file = new RevFile("/etc/passwd");

    while ( ! $file->sof() ) {
    echo $file->GetLine() ;
    }

    class RevFile {

    var $FileName;
    var $FileHandle;
    var $FilePos;

    function RevFile($filename) {

    $this->FileName = $filename;

    $this->FileHandle = @fopen($filename, "r") or
    die("Could not open file $filename\n");

    // Find EOF
    if ( ! (fseek($this->FileHandle, 0, SEEK_END ) == 0 ))
    die ("Could not find end of file in $filename\n");

    // Store file position
    $this->FilePos = ftell($this->FileHandle);

    // Check that file is not empty or doesn;t contain a single newline
    if ($this->FilePos < 2 )
    die ("File is empty\n");

    // Position file pointer just before final newline
    // i.e. Skip EOF
    $this->FilePos -= 1;
    }
    function GetLine() {
    $pos = $this->FilePos -1;
    $ch=" ";
    $line = "";
    while ($ch != "\n" && $pos >= 0) {
    fseek($this->FileHandle, $pos );
    $ch = fgetc($this->FileHandle);

    // Decrement out pointer and prepend to the line
    // if we have not hit the new line
    if ( $ch != "\n" ) {
    $pos = $pos -1;
    $line = $ch . $line;
    }
    }
    $this->FilePos = $pos ;
    return $line . "\n";
    }

    function sof() {
    return ($this->FilePos <= 0 );
    }
    }
    ?>
     
  6. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225

    При таком способе, у меня скриптик отработал 55 минут и без движений... 3 раза пробовал - безрезультатно.
     
    Iwashka нравится это.
  7. Hemi-Sync

    Hemi-Sync Постоялец

    Регистр.:
    17 дек 2006
    Сообщения:
    88
    Симпатии:
    38
    55 минут? Да ну вряд ли. максимум памяти по дефолту = 8 метров. Оперативка щас у всех на 2 порядка больше минимум. А вот что там делает скрипт помимо чтения - неизвестно. Попробуй просто разверни файл и читай его потом с начала без выкрутасов.
     
  8. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    1- если нужно всегда чиать с начала то и пиши в начало фаила а не в конец
    2- попробуй перечитай фаил в другой в нужном порядке
    3-55 минут... у меня фаил 90 мег расколбасил на 70 000 новостей, за 28 сек
    но это было еще на старом движке, но новом нагрузка меньше... да и дакой фаил созать просто не реальо теперь тк 1 запись всего 100 символов
    так что читай фаил в масив и потом реверс

     
Статус темы:
Закрыта.