2011-08-25 32 views
0

我實際上正在開發一個允許我打開文件的類&逐行讀取它。如何在不使用fgets()&file()的情況下前往第n行?

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方法時獲得八位字節的大小。

感謝

回答

3

考慮到一個文本文件,可以在一個線路任意數量的文本,沒有100%的方法來快速跳轉到一個位置。除非文本格式完全固定並且已知,否則必須逐行讀取,直到達到所需的行號。

如果文件在會話之間沒有變化,您可以使用ftell()(基本上距離您讀取的文件有多遠)將文件的「指針」存儲在文件中,然後通過fseek()跳轉到該位置。您也可以讓getLine方法在讀取每一行時存儲偏移量,因此您可以隨時構建一組行/偏移量。這可以讓你在文件中向後跳到任意位置。但是,它不會讓你跳轉到文件的未知部分。

+0

文件在會話之間不會改變。使用ftell()&fseek()的解決方案可以很好地工作。謝謝 ! – egeloen

相關問題