一、fwrite()寫入檔案
將程式中的資料儲存到檔案中比較容易,使用fwrite()函數就可以將字串內容寫入檔案中。在檔案中中通過字元序列\n表示分行符號,表示檔案中一行的末尾。當需要一次輸入或輸出一行資訊時,請記住這一點。不同的作業系統具有不同的結束符號,基於UNIX的系統使用“\n”作為行結束字元,基於Windows系統使用“\r\n”作為行結束字元,基於Macintosh的系統使用“\r”作為行結束字元。當要寫入一個文字檔並想插入一個新行時,需要使用相應作業系統的行結束符號。函數fwrite()的原型如下所示:
複製代碼 代碼如下:
int fwrite(resource handle,string string[,int length]) //寫入檔案
第一個參數需要提供fopen()函數開啟的檔案資源,該函數將第二個參數提供的字串內容輸出到由第一個參數指定的資源中。如果給出了第三個選擇性參數lenth,fwrite()將在寫入了length個字元時會停止。否則將一直寫入,直到到達內容結尾時才停止。如果寫入的內容少於length個位元組,該函數也會在寫完全部內容後停止。函數fwrite()執行完成以後會返回寫入的字元數,出現錯誤時則返回FALSE。下面的代碼是寫入檔案的一個樣本。
複製代碼 代碼如下:
<?php
//聲明一個變數用來儲存檔案名稱
$fileName = "data.txt";
//使用fopen()函數以唯寫的模式開啟檔案,如果不存在則建立它,開啟失敗則通過程式
$handle = fopen($fileName,'w') or die('開啟<b>'.$fileName.'</br>檔案失敗!!');
//迴圈10次寫入10行資料到檔案中
for($row=0;$row<10;$row++){
fwrite($handle, $row.":www.lampbrother.net\n");
}
fclose($handle);
?>
該程式執行後,如果目前的目錄下存在data.txt檔案,則清空該檔案並寫入10行資料。如果不存在data.txt檔案,則會建立該檔案並將10行資料寫入。另外寫入檔案還可以使用fputs()函數,該函數是fwrite()函數的別名函數如果需要快速寫入檔案,可以使用file_put_contents()函數,和依次調用fopen(),fwrite()以及fclose()函數的功能一樣。該函數的使用代碼如下所示:
複製代碼 代碼如下:
<?php
//聲明一個變數用來儲存檔案名稱
$fileName = "data.txt";
//聲明一個變數用來儲存被寫入檔案中的資料
$data = "共10行資料\n";
for($row=0;$row<10;$row++){
//將10資料都存放到一個字串變數中
$data .= $row.":www.lampbrother.net\n";
}
//一次將所有資料寫入到指定的檔案中
file_put_contents($fileName, $data);
?>
該函數可以將資料直接寫入到指定的檔案中。如果同時調用多次時,並向同一個檔案中寫入資料,則檔案中只儲存了最後一次調用該函數寫入的資料。因為在每次掉喲哦那個時都會重新開啟檔案並將檔案中原有的資料清空,所以不能像第一個程式那樣連續寫入多行資料。
二、讀取檔案內容
在PHP中提供了多個從檔案中讀取內容的標準函數,可以根據它們的功能特性在程式中選擇哪個函數使用。這些函數功能及其描述如下表所示。
在讀取檔案時,不僅要注意行結束符號“\n”,程式也需要一種標準的方式來識別何時到達檔案的末尾,這個標準通常成為EOF(End Of File)字元。EOF是非常重要的概念,幾乎每種主流的程式設計語言中都提供了相應的內建函數,來分析是否到達了檔案EOF。在PHP中,使用feof()函數。該函數接受一個開啟的檔案資源,判斷一個檔案指標是否位於檔案的結束處,如果在檔案末尾處,則返回TRUE。
①函數fread()
該函數用來在開啟的檔案中讀取指定長度的字串。也可以安全用於二進位檔案,在區分二進位檔案和文字檔的系統上(如Windows)開啟檔案時,fopen()函數的mode參數要加上'b'。函數fread()的原型如下所示:
複製代碼 代碼如下:
string fread(int handle,int length) //讀取開啟的檔案
該函數從檔案指標資源handle中讀取最多length個位元組。在讀取完length個位元組數,或到達EOF時,或(對於網路流)當一個包可用時都會停止讀取檔案,就看先碰到哪種情況了。該函數返回讀取的內容字串,如果失敗則返回FALSE。函數的使用代碼如下所示:
複製代碼 代碼如下:
<?php
//從檔案中讀取指定位元組數的內容存入到一個變數中
$filename = "data.txt";
$handle = fopen($filename, 'r') or die("檔案開啟失敗 ");
$contents = fread($handle, 100); //從檔案中讀取100個位元組
fclose($handle); //關閉檔案資源
echo $contents; //將從檔案中讀取的內容輸出
//從檔案中讀取全部內容到一個變數中,每次讀取一部分,迴圈讀取
$filename = "c:\\files\\somepic.gif";
$handle = fopen($filename, 'rb') or die("檔案開啟失敗"); //以唯讀方式,模式加了‘b'
$contents = "";
while(!feof($handle)){ //使用feof()判斷檔案結尾
$contents .=fread($handle, 1024); //每次讀取1024個位元組
}
fclose($handle); //關閉檔案資源
echo $contents; //將從檔案中讀取的全部內容輸出
//另一種從檔案中讀取全部內容的方法
$filename = "data.txt";
$handle = fopen($filename, "r")or die("檔案開啟失敗");
$contents = fread($handle, filesize($filename)); //使用fielsize()函數一起讀出
fclose($handle);
echo $contents;
?>
如果你只是想將一個檔案的內容讀入到一個字串中,可以用file_get_contents()函數,它的效能比上面的代碼好得多。file_get_contents()函數是用來將檔案的內容讀入到一個字串中的首選方法,如果作業系統支援,還會使用記憶體映射技術來增強效能。該函數的使用代碼如下所示:
複製代碼 代碼如下:
<?php
echo file_get_contents("data.txt"); //讀取文字檔中的內容並輸出
echo file_get_contents("c:\\files\\somepic.gif"); //讀取二進位檔案中的內容並輸出
?>
②函數fgets()、fgetc()
fgets()該函數一次至多從開啟的檔案資源中讀取一行內容。函數fgets()的原型如下所示:
複製代碼 代碼如下:
string fgets(int handle[,int length]) //從開啟的檔案中返回一行
第一個參數提供使用fopen()函數開啟的資源。如果提供了第二個選擇性參數length,該函數返回length-1個位元組。或者返回遇到換行或EOF之前讀取的所有內容。如果忽略可選的length參數,預設為1024個字元。在大多數情況下,這意味著fgets()函數將讀取到1024個字元前遇到分行符號號,因此每次成功調用都會返回下一行。如果讀取失敗則返回FALSE。該函數的使用代碼如下所示:
複製代碼 代碼如下:
<?php
$handle = fopen("data.txt", "r") or die("檔案開啟失敗 "); //以唯讀模式開啟檔案
while(!feof($handle)){
$buffer = fgets($handle,4096); //一次讀取一行內容
echo $buffer."<br>"; //輸出每一個航
}
fclose($handle);
?>
函數fgetc()在開啟的檔案資源中唯讀取當前指標位置處的一個字元。如果遇到檔案結束標誌EOF,則返回FALSE值。該函數的使用代碼如下所示:
複製代碼 代碼如下:
<?php
$fp = fopen('data.txt','r') or die("檔案開啟失敗");
while(false !==($char = fgetc($fp))){
echo $char."<br>";
}
?>
③函數file()
該函數非常有用,與file_get_contents()類似,不需要使用fopen()函數開啟檔案,不同的是file()函數可以把整個檔案讀入到一個數組中。數組中的每個元素對應檔案中相應的行,各元素由分行符號分割,同時分行符號仍附加在每個元素的末尾。這樣,就可以使用數組的相關函數對檔案內容進行處理。該函數的使用代碼如下所示:
複製代碼 代碼如下:
<?php
//將檔案test.txt中的內容讀入到一個數組中,並輸出
print_r(file(test.txt));
?>
④函數readfile()
該函數可以讀取指定的整個檔案,立即輸出到輸出緩衝區,並返回讀取的位元組數。該函數也不需要使用fopen()函數開啟檔案。在下面的樣本中,輕鬆地將檔案內容輸出到瀏覽器。代碼如下所示:
複製代碼 代碼如下:
<?php
//直接將檔案data.txt中的資料讀出並輸出到瀏覽器
readfile("data.txt");
?>