Board logo

標題: 6-3-2 讀取檔案資料 [打印本頁]

作者: 小誌    時間: 2011-4-19 18:41     標題: 6-3-2 讀取檔案資料

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



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


思考一下!
在範例ex6_8.php文字檔案內的資料輸出時,所有的字都連在一起了,可是原始的文字檔內容卻是分成兩行的耶!請問您:該如何讓輸出的資料能照原始檔案內容一般的分成兩行?
作者: 小誌    時間: 2011-4-19 18:43

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

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

第二種多字元讀取方式是使用fgets()函數:
fgets() 函數格式
  1. string fgets ( resource handle [, int length])
複製代碼
fgets()函數也可以讀取指定長度的資料,可是它的長度參數必須比我們要取的資料長度再多一個字元,例如:
ex6_10.php
  1. <?
  2. $myfile="contest.txt";
  3. if (file_exists($myfile))
  4.   {
  5.     $file=fopen($myfile,"r");
  6.     echo fgets($file,21); //其實只取得20個字元
  7.     fclose($file);
  8.   }
  9. else
  10.   {
  11.    echo "檔案不存在";
  12.   }
  13. ?>
複製代碼
fgets()函數含有一個特點,如果讀取資料時遇到換行符號或檔案結尾,就會結束讀取動作。因此,fgets()函數也可稱它為「行讀取」函數。
作者: 小誌    時間: 2011-4-19 18:44

我們可不可以利用fread()函數或fgets()函數把檔案內容全部讀出來?當然可以!我們可以利用「feof()」函數來判斷我們讀取的資料是否已到檔案結尾,如果是就停止讀取,反之就繼續讀取。
之前不是給您一個「思考一下」的問題嗎?您現在知道該如何解決了吧!沒錯!就是要利用fgets()函數的「行讀取」特性,fgets()函數每讀到換行符號就會結束讀取,這個時候,我們就加個「<br>」標籤:
ex6_11.php
  1. <?
  2. $myfile="contest.txt";
  3. if (file_exists($myfile))
  4.   {
  5.     $file=fopen($myfile,"r");
  6.      while(!feof($file))
  7.       {
  8.        echo fgets($file) . "<br>";
  9.       }
  10.     fclose($file);
  11.   }
  12. else
  13.   {
  14.    echo "檔案不存在";
  15.   }
  16. ?>
複製代碼
[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
  1. <?
  2. $myfile="contest.txt";
  3. if (file_exists($myfile))
  4.   {
  5.     $file=fopen($myfile,"r");
  6.     while(!feof($file))
  7.      {
  8.       echo str_replace("\r\n" ,"<br>" ,fread($file,20));
  9.       }
  10.     fclose($file);
  11.   }
  12. else
  13.   {
  14.    echo "檔案不存在";
  15.   }
  16. ?>
複製代碼

作者: 小誌    時間: 2011-4-19 18:45

如果您喜歡一個字元一個字元慢慢的讀取也行,那就使用fgetc()函數吧!如果函數發生錯誤時回傳False。
fgetc() 函數格式
  1. string fgetc ( resource handle)
複製代碼
例如:
ex6_13.php
  1. <?
  2. $myfile="contest.txt";
  3. if (file_exists($myfile))
  4.   {
  5.     $file=fopen($myfile,"r");
  6.      while(!feof($file))
  7.       {
  8.        echo fgetc($file);
  9.       }
  10.     fclose($file);
  11.   }
  12. else
  13.   {
  14.    echo "檔案不存在";
  15.   }
  16. ?>
複製代碼

作者: 小誌    時間: 2011-4-19 18:46

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




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)