標題:
6-3-2 讀取檔案資料
[打印本頁]
作者:
小誌
時間:
2011-4-19 18:41
標題:
6-3-2 讀取檔案資料
6-3-2 讀取檔案資料
不管是要從檔案中讀取資料,還是要將資料寫入檔案,您都要注意一件事:確認已使用fopen()函數成功的開啟某個檔案!
顯示檔案內容
當我們已經完成檔案的開啟動作後,可利用fpassthru()函數一次讀取全部的檔案資料並將這些資料輸出到網頁畫面中:
fpassthru() 函數格式
int fpassthru ( resource handle)
複製代碼
例如:
ex6_8.php
<?
$myfile="contest.txt";
if (file_exists($myfile))
{
$file=fopen($myfile,"r");
fpassthru($file);
}
else
{
echo "檔案不存在";
}
?>
複製代碼
[attach]5576[/attach]
圖6-25 範例6_8.php。
思考一下!
在範例ex6_8.php文字檔案內的資料輸出時,所有的字都連在一起了,可是原始的文字檔內容卻是分成兩行的耶!請問您:該如何讓輸出的資料能照原始檔案內容一般的分成兩行?
作者:
小誌
時間:
2011-4-19 18:43
讀取檔案內容
利用fpassthru()函數會一次讀取全部的檔案並輸出,可是我不想全部輸出ㄚ,我可能只是要取出資料來利用,或是只要輸出部分檔案內容而已耶!這個時候我們可以改用「多字元讀取」與「單字元讀取」。
第一種多字元讀取方式是使用fread()函數:
fread() 函數格式
string fread ( resource handle, int length)
複製代碼
例如:
ex6_9.php
<?
$myfile="contest.txt";
if (file_exists($myfile))
{
$file=fopen($myfile,"r");
echo fread($file,20);
fclose($file); //關閉已開啟的檔案
}
else
{
echo "檔案不存在";
}
?>
複製代碼
上例敘述:自檔案最前面開始抓回20個字元長度的資料,一個中文字算兩個字元,資料輸出後,若不再需要已開啟的檔案,則以「fclose()」函數關閉檔案。
利用fpassthru()函數讀取檔案內容時,若尚未讀取到指定個數的字元就己經到達檔案結尾,則傳回目前已經讀取的字元
第二種多字元讀取方式是使用fgets()函數:
fgets() 函數格式
string fgets ( resource handle [, int length])
複製代碼
fgets()函數也可以讀取指定長度的資料,可是它的長度參數必須比我們要取的資料長度再多一個字元,例如:
ex6_10.php
<?
$myfile="contest.txt";
if (file_exists($myfile))
{
$file=fopen($myfile,"r");
echo fgets($file,21); //其實只取得20個字元
fclose($file);
}
else
{
echo "檔案不存在";
}
?>
複製代碼
fgets()函數含有一個特點,如果讀取資料時遇到換行符號或檔案結尾,就會結束讀取動作。因此,fgets()函數也可稱它為「行讀取」函數。
作者:
小誌
時間:
2011-4-19 18:44
我們可不可以利用fread()函數或fgets()函數把檔案內容全部讀出來?當然可以!我們可以利用「feof()」函數來判斷我們讀取的資料是否已到檔案結尾,如果是就停止讀取,反之就繼續讀取。
之前不是給您一個「思考一下」的問題嗎?您現在知道該如何解決了吧!沒錯!就是要利用fgets()函數的「行讀取」特性,fgets()函數每讀到換行符號就會結束讀取,這個時候,我們就加個「<br>」標籤:
ex6_11.php
<?
$myfile="contest.txt";
if (file_exists($myfile))
{
$file=fopen($myfile,"r");
while(!feof($file))
{
echo fgets($file) . "<br>";
}
fclose($file);
}
else
{
echo "檔案不存在";
}
?>
複製代碼
[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
<?
$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 "檔案不存在";
}
?>
複製代碼
作者:
小誌
時間:
2011-4-19 18:45
如果您喜歡一個字元一個字元慢慢的讀取也行,那就使用fgetc()函數吧!如果函數發生錯誤時回傳False。
fgetc() 函數格式
string fgetc ( resource handle)
複製代碼
例如:
ex6_13.php
<?
$myfile="contest.txt";
if (file_exists($myfile))
{
$file=fopen($myfile,"r");
while(!feof($file))
{
echo fgetc($file);
}
fclose($file);
}
else
{
echo "檔案不存在";
}
?>
複製代碼
作者:
小誌
時間:
2011-4-19 18:46
移動讀取的位置
如果:我想取得檔案中特定位置特定長度的資料時該如何處理?例如:我要讀取檔案內第11個字元起,長度為20個字元的資料,該如何做?
當然就是先將讀取位置一到第11個字元上囉,要移動讀取位置可使用fseek()函數:
fseek() 函數格式
int fseek ( resource handle, int offset [, int whence])
複製代碼
Offset參數是檔案開頭算起的偏移量,也就是我們要從哪裡開始讀取,設定了偏移量之後,我們再利用其他資料讀取函數來讀取特定長度的資料,例如:
ex6_13.php
<?
$myfile="contest.txt";
if (file_exists($myfile))
{
$file=fopen($myfile,"r");
fseek($file,10); //設定讀取起始位置
echo fgets($file,20); //讀取指定長度的資料
fclose($file);
}
else
{
echo "檔案不存在";
}
?>
複製代碼
那我想知道:現在檔案資料讀取到哪個位置了,則可以使用ftell()函數來得知:
ftell() 函數格式
int ftell ( resource handle)
複製代碼
ftell()函數回傳值是一個整數,也就是現在檔案資料讀取位置。
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)