二、數(shù)據(jù)的存儲與檢索

1、文件處理流程

文件處理流程:
寫入文件流程:

  1. 打開文件,文件不存在就創(chuàng)建;
  2. 將數(shù)據(jù)寫入文件;
  3. 關(guān)閉文件。
    讀文件流程:
  4. 打開文件,若文件不能打開,能正確退出;
  5. 從文件中讀取數(shù)據(jù);
  6. 關(guān)閉文件。

1.打開文件

fopen(filename,mode,include_path,context)
參數(shù)      描述
filename    必需。規(guī)定要打開的文件或 URL。
mode       必需。規(guī)定要求到該文件/流的訪問類型??赡艿闹狄娤卤怼?include_path    可選。如果也需要在 include_path 中檢索文件的話,可以將該參數(shù)設(shè)為 1 或 TRUE。
context     可選。規(guī)定文件句柄的環(huán)境。Context 是可以修改流的行為的一套選項。
$fp = fopen("$_SERVER['DOCUMENT_ROOT']/html/orders/orders.txt ", "w");
$_SERVER['DOCUMENT_ROOT'] 這個變量指向web服務(wù)器配置的根目錄。D:/php/xampp/htdocs 
w 表示寫
fopen()函數(shù)的文件模式
r:  只讀  只讀方式打開,將文件指針指向文件頭;
r+: 只讀  讀寫方式打開,將文件指針指向文件頭;
w:  只寫  寫入方式打開,將文件指針指向文件頭并將文件大小截為0,如果文件不存在嘗試創(chuàng)建之;
w+: 只寫  讀寫方式打開,將文件指針指向文件頭并將文件大小截為0,如果我文件不存在則嘗試創(chuàng)建之;
a:  追加模式  寫入方式打開,將文件指針指向文件末尾,如果文件不存在則嘗試創(chuàng)建之;
a+: 追加模式  讀寫方式打開,將文件指針指向文件末尾,如果文件不存在則嘗試創(chuàng)建之;
x:  謹慎寫  創(chuàng)建并以寫模式打開,將文件指針指向文件頭,若文件已存在,則fopen()調(diào)用失敗并返回false;
x+: 謹慎寫  創(chuàng)建并以讀寫方式打開,并將文件指針指向文件頭,若文件已存在,則fopen()調(diào)用失敗并返回false。
b:  二進制模式,用于與其他模式連接,如:ab
t:  文本 用于與其他模式結(jié)合

2、寫文件

fwrite(fp,string,length) 或 fputs() [fputs()是fwrite()函數(shù)的別名]
該函數(shù)是二進制安全的。(意思是二進制數(shù)據(jù)(如圖像)和字符數(shù)據(jù)都可以使用此函數(shù)寫入。)
參數(shù)  描述
fp  必需。規(guī)定要寫入的打開文件。
string  必需。規(guī)定要寫入文件的字符串。
length  可選。規(guī)定要寫入的最大字節(jié)數(shù)。
-----------------------------------------------------------
$fp = fopen("$_SERVER['DOCUMENT_ROOT']/html/orders/orders.txt ", "ab");
$string = 'abcdefghigklmn';
fwirte($fp, $string);//將$string添加到已打開的文件末尾
當使用二進制模式執(zhí)行寫操作的時候,第3個參數(shù)就可以使用了,他可以幫助我們避免一些跨平臺的兼容問題。
fwrite($fp, $string, strlen($string));

3、關(guān)閉文件fclose();
4、顯示文件內(nèi)容

@ $fp = fopen("$DOCUMENT_ROOT/html/orders/orders.txt", 'rb');
            if(! $fp){
                echo "<p><strong> Your order could not be processed at this time.
                    Please try again later.</strong></p></body></html>";
                exit;
            }
            while (!feof($fp)){
                $order = fgets($fp, 999);
                echo $order."<br />";
            }
1. fopen()打開文件,上例中使用了 'rb' 只讀模式
2. feof()[file end of file文件末尾的意思] 判斷何時讀完文件。
   feof()的唯一參數(shù)是文件指針,如果文件指針指向了文件末尾,將返回true
3. 每次讀一行數(shù)據(jù):fgets(),fgetss(),fgetcsv()
   * fgets($fp,999);不斷讀取數(shù)據(jù),直到讀到一個換行符(\n)或者文件結(jié)束符EOF,或者從文件中讀取了998B??梢宰x取的最大長度為指定的長度減去1B。
   * fgetss() 原型為
     string fgetss(resource fp, int length, string [allowable_tags]);三個參數(shù)
     fgetss()可以過濾字符串中包含的PHP和HTML 標記
   * fgetcsv() 原型為
     array fgetcsv(fp, [length], [separator], [enclosure])
     fp 必需。規(guī)定要檢查的文件。
     length 可選。規(guī)定行的最大長度。必須大于 CVS 文件內(nèi)最長的一行。如果忽略(在 PHP 5.0.4 以后的版本中設(shè)為 0)該參數(shù)的話,那么長度就沒有限制,不過可能會影響執(zhí)行效率。
     separator 可選。設(shè)置字段分界符(只允許一個字符),默認值為逗號。
     enclosure 可選。設(shè)置字段環(huán)繞符(只允許一個字符),默認值為雙引號。
     例如 $order = fgetcsv($fp, 100, "\t");讀一行,存在制表符的地方將內(nèi)容分行,返回數(shù)組。

5、讀取整個文件

*readfile(filename, [include_path], [context]);
filename必需。規(guī)定要讀取的文件。
include_path可選。如果也想在 include_path中搜索文件,可以使用該參數(shù)并將其設(shè)為 true。
context可選。規(guī)定文件句柄的環(huán)境。Context 是可以修改流的行為的一套選項。(文件被遠程打開時才使用如通過http)
*fpassthru();使用這個函數(shù)必須先使用fopen()函數(shù)打開文件。返回值為讀取并傳遞到輸出的字符數(shù)目 如果已經(jīng)向文件寫入數(shù)據(jù),就必須調(diào)用 [rewind()]來將文件指針指向文件頭
例子:
    $fp = fopen("html/a.txt",'rb');
    $fpassthru($fp);
*file(path,[include_path],[context]);與file_get_contents()類似,不同的是 file() 將文件作為一個數(shù)組返回。數(shù)組中的每個單元都是文件中相應(yīng)的一行,包括換行符在內(nèi)
    $fileArray = file("$DOCUMENT_ROOT/html/orders/orders.txt");
    var_dump($fileArray);
*file_get_contents(path,[include_path],[context],[start],[max_length]) 函數(shù)把整個文件讀入一個字符串中
path 必需。規(guī)定要讀取的文件。
include_path 可選。如果也想在 include_path 中搜尋文件的話,可以將該參數(shù)設(shè)為 "1"。
context 可選。規(guī)定文件句柄的環(huán)境。context 是一套可以修改流的行為的選項。若使用 null,則忽略。
start 可選。規(guī)定在文件中開始讀取的位置。該參數(shù)是 PHP 5.1 新加的。
max_length 可選。規(guī)定讀取的字節(jié)數(shù)。該參數(shù)是 PHP 5.1 新加的。

6、其他讀取文件內(nèi)容的函數(shù)

*一次讀取一個字符:fgetc(handle);
        while(!feof($fp)){
            $char = fgetc($fp);
            if(!feof($fp)){
                echo ($char == "\n" ? "<br />":$char);
            }
        }
*讀取任意字符長度:fread(fp,length);
該函數(shù)將文件讀完或到指定長度停止

7、其他有用的文件函數(shù)

  • 查看文件是否存在:file_exists()
  • 確定文件大?。?code>filesize()
可以與fread()結(jié)合使用
        $fp = fopen("$DOCUMENT_ROOT/html/orders/orders.txt", 'rb');
        echo nl2br(fread($fp, filesize("$DOCUMENT_ROOT/html/orders/orders.txt")));
        fclose($fp);
*
nl2br();函數(shù)將"\n"字符轉(zhuǎn)換為html的"<br />"
  • 刪除文件:unlink(filename)失敗返回值為false
  • 在文件中定位:rewind(),fseek(),ftell()
rewind();函數(shù)將文件指針復(fù)位到文件的開始位置;
ftell();函數(shù)以字節(jié)為單位報告文件指針當前在文件中的位置;
fseek(fp,offset,[whence]);
fp必需。規(guī)定要在其中定位的文件。
offset必需。規(guī)定新的位置(從文件頭開始以字節(jié)數(shù)度量)。
whence可選。可能的值:
SEEK_SET - 設(shè)定位置等于 offset 字節(jié)。默認。
SEEK_CUR - 設(shè)定位置為當前位置加上 offset。
SEEK_END - 設(shè)定位置為文件末尾加上 offset(要移動到文件尾之前的位置,offset 必須是一個負值)
  • 文件鎖定 flock()
flock(file,lock,[block])//意義不大,用數(shù)據(jù)庫解決問題比較好,用著的時候百度下用處即可

以上介紹這些文件操作,在現(xiàn)實中其實意義不大。
1.并發(fā)問題無法解決;
2.文件變大的,處理起來將會非常緩慢;
3.查找不方便;
4.增刪改查極不方便;
5.插入或刪除時將文件讀入內(nèi)存中將帶來極大的開銷;
6.訪問權(quán)限問題無法解決。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容