Как я могу перейти к n-й строке, не используя fgets () и file ()? - PullRequest
0 голосов
/ 25 августа 2011

Я фактически разрабатываю класс, который позволяет мне открывать файл и читать его построчно.

class File
{
    protected $path = null;

    protected $cursor = null;

    protected $lineCount = 0;

    public function isOpen()
    {
        return !is_null($this->cursor);
    }

    public function open($flag = 'r')
    {
        if(!$this->isOpen())
            $this->cursor = fopen($this->path, $flag);
    }

    public function getLine()
    {
        $this->open();

        $line = fgets($this->cursor);
        $this->lineCount++;

        return $line;
    }

    public function close()
    {
        if($this->isOpen())
            fclose($this->cursor);
    }
}

По какой-то причине я хотел бы, чтобы файл открывался в строке, которая описываетсяlineCount свойство.Я не могу, как я могу обновить метод open() для этого.

Вместо того, чтобы использовать счетчик строк, я могу использовать размер от начала файла в октете и использовать метод fseekпереместить курсор в нужное место.Но я не знаю, как я могу получить размер строки в октете, когда я вызываю метод fgets.

Спасибо

1 Ответ

3 голосов
/ 25 августа 2011

Учитывая, что текстовый файл может содержать любое количество текста в строке, не существует 100% метода быстрого перехода к позиции.Если текстовый формат не является точно фиксированным и известным, вам придется читать построчно, пока не достигнете нужного номера строки.

Если файл не меняется между сеансами, вы можете сохранить«указатель» в файле, используя ftell() (в основном, как далеко в файл, который вы прочитали), а затем перейти к этой позиции с помощью fseek().Вы также можете сделать так, чтобы ваш метод getLine сохранял смещения при чтении каждой строки, поэтому вы строите массив строк / смещений по ходу работы.Это позволило бы вам перепрыгнуть назад в файл к любой произвольной позиции.Однако это не позволит вам перейти вперед в неизвестные части файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...