麻辣家族討論版版's Archiver

小誌 發表於 2011-4-19 18:41

6-3-2 讀取檔案資料

[color=DarkRed][size=4][b]6-3-2   讀取檔案資料[/b][/size][/color]
不管是要從檔案中讀取資料,還是要將資料寫入檔案,您都要注意一件事:確認已使用fopen()函數成功的開啟某個檔案!



[color=RoyalBlue][size=3][b]顯示檔案內容[/b][/size][/color]
當我們已經完成檔案的開啟動作後,可利用fpassthru()函數一次讀取全部的檔案資料並將這些資料輸出到網頁畫面中:
fpassthru() 函數格式[code]int fpassthru ( resource handle)[/code]例如:
ex6_8.php[code]<?
$myfile="contest.txt";
if (file_exists($myfile))
  {
    $file=fopen($myfile,"r");
    fpassthru($file);
  }
else
  {
   echo "檔案不存在";
  }
?>[/code][attach]5576[/attach]
圖6-25  範例6_8.php。


[color=Red]思考一下![/color]
在範例ex6_8.php文字檔案內的資料輸出時,所有的字都連在一起了,可是原始的文字檔內容卻是分成兩行的耶!請問您:該如何讓輸出的資料能照原始檔案內容一般的分成兩行?

小誌 發表於 2011-4-19 18:43

[color=RoyalBlue][size=3][b]讀取檔案內容[/b][/size][/color]利用fpassthru()函數會一次讀取全部的檔案並輸出,可是我不想全部輸出ㄚ,我可能只是要取出資料來利用,或是只要輸出部分檔案內容而已耶!這個時候我們可以改用「多字元讀取」與「單字元讀取」。

[color=Magenta]第一種多字元讀取方式是使用fread()函數:[/color]
fread() 函數格式[code]string fread ( resource handle, int length)[/code]例如:
ex6_9.php[code]<?
$myfile="contest.txt";
if (file_exists($myfile))
  {
    $file=fopen($myfile,"r");
    echo fread($file,20);
    fclose($file); //關閉已開啟的檔案
  }
else
  {
   echo "檔案不存在";
  }
?>[/code]上例敘述:自檔案最前面開始抓回20個字元長度的資料,一個中文字算兩個字元,資料輸出後,若不再需要已開啟的檔案,則以「fclose()」函數關閉檔案。
利用fpassthru()函數讀取檔案內容時,若尚未讀取到指定個數的字元就己經到達檔案結尾,則傳回目前已經讀取的字元

[color=Magenta]第二種多字元讀取方式是使用fgets()函數:[/color]
fgets() 函數格式[code]string fgets ( resource handle [, int length])[/code]fgets()函數也可以讀取指定長度的資料,可是它的長度參數必須比我們要取的資料長度再多一個字元,例如:
ex6_10.php[code]<?
$myfile="contest.txt";
if (file_exists($myfile))
  {
    $file=fopen($myfile,"r");
    echo fgets($file,21); //其實只取得20個字元
    fclose($file);
  }
else
  {
   echo "檔案不存在";
  }
?>[/code][color=Red]fgets()函數含有一個特點,如果讀取資料時遇到換行符號或檔案結尾,就會結束讀取動作。因此,fgets()函數也可稱它為「行讀取」函數。[/color]

小誌 發表於 2011-4-19 18:44

我們可不可以利用fread()函數或fgets()函數把檔案內容全部讀出來?當然可以!我們可以利用「feof()」函數來判斷我們讀取的資料是否已到檔案結尾,如果是就停止讀取,反之就繼續讀取。
之前不是給您一個「思考一下」的問題嗎?您現在知道該如何解決了吧!沒錯!就是要利用fgets()函數的「行讀取」特性,fgets()函數每讀到換行符號就會結束讀取,這個時候,我們就加個「<br>」標籤:
ex6_11.php[code]<?
$myfile="contest.txt";
if (file_exists($myfile))
  {
    $file=fopen($myfile,"r");
     while(!feof($file))
      {
       echo fgets($file) . "<br>";
      }
    fclose($file);
  }
else
  {
   echo "檔案不存在";
  }
?>[/code][attach]5577[/attach]
圖6-26  範例ex6_11.php。

小誌 發表於 2011-4-19 18:45

難道我真的不能使用fpassthru()函數一次讀取全部的檔案資料,並將這些資料依原來的段落格式輸出到網頁畫面中嗎?那倒也未必,文字檔案內的換行符號跟表單元件「多行文字輸入元件」一樣,都是「\r\n」,這個換行字元在我們輸出到瀏覽器時並不會有換行的效果,因此,輸出時應先使用「str_replace()」函數將這個換行字元「\r\n」替換成「<Br>」或「<P>」的HTML標籤符號。
ex6_12.php[code]<?
$myfile="contest.txt";
if (file_exists($myfile))
  {
    $file=fopen($myfile,"r");
    while(!feof($file))
     {
      echo str_replace("\r\n" ,"<br>" ,fread($file,20));
      }
    fclose($file);
  }
else
  {
   echo "檔案不存在";
  }
?>[/code]

小誌 發表於 2011-4-19 18:45

如果您喜歡一個字元一個字元慢慢的讀取也行,那就使用fgetc()函數吧!如果函數發生錯誤時回傳False。
fgetc() 函數格式[code]string fgetc ( resource handle)[/code]例如:
ex6_13.php[code]<?
$myfile="contest.txt";
if (file_exists($myfile))
  {
    $file=fopen($myfile,"r");
     while(!feof($file))
      {
       echo fgetc($file);
      }
    fclose($file);
  }
else
  {
   echo "檔案不存在";
  }
?>[/code]

小誌 發表於 2011-4-19 18:46

[color=RoyalBlue][size=3][b]移動讀取的位置[/b][/size][/color]
如果:我想取得檔案中特定位置特定長度的資料時該如何處理?例如:我要讀取檔案內第11個字元起,長度為20個字元的資料,該如何做?
當然就是先將讀取位置一到第11個字元上囉,要移動讀取位置可使用fseek()函數:
fseek() 函數格式[code]int fseek ( resource handle, int offset [, int whence])[/code]Offset參數是檔案開頭算起的偏移量,也就是我們要從哪裡開始讀取,設定了偏移量之後,我們再利用其他資料讀取函數來讀取特定長度的資料,例如:
ex6_13.php[code]<?
$myfile="contest.txt";
if (file_exists($myfile))
  {
    $file=fopen($myfile,"r");
     fseek($file,10); //設定讀取起始位置
     echo fgets($file,20);  //讀取指定長度的資料
    fclose($file);
  }
else
  {
   echo "檔案不存在";
  }
?>[/code]那我想知道:現在檔案資料讀取到哪個位置了,則可以使用ftell()函數來得知:
ftell() 函數格式[code]int ftell ( resource handle)[/code]ftell()函數回傳值是一個整數,也就是現在檔案資料讀取位置。

頁: [1]

麻辣家族討論版版為 麻辣學園 網站成員  由 昱得資訊工作室 © Since 1993 所提供