星期一, 八月 04, 2008

PHP: 讀取檔案 fgets 和 fread 的差異

程式在寫時, 何時要用 fgets? 何時要用 fread? 主要的差異在哪邊? 以下就用簡單的範例來說明~

先建立一個檔案: /tmp/readfile.txt, 內容如下:

abcdefg
123456789

寫兩隻簡單的小程式:

fgets 版

<?php
$handle = fopen('/tmp/readfile.txt', "r");
$contents = '';
if ($handle) {
    while (!feof($handle)) {
        $contents = fgets($handle, 10);
        echo $contents;
        exit;
    }
    fclose($handle);
}
?>

執行得到的內容:

abcdefg

fread 版

<?php
$handle = fopen('/tmp/readfile.txt', "r");
$contents = '';
if ($handle) {
    while (!feof($handle)) {
        $contents .= fread($handle, 10);
        echo $contents;
        exit;
     }
    fclose($handle);
}
?>

執行得到的內容:

abcdefg
12

fgets 和 fread 主要的差異

  • fgets 是 一次讀一行 (Gets a line from file pointer.)
  • fread 會把整個檔案都讀出來, 然後再去看要抓多少 bytes.

所以 fgets 讀到的是第一行到結束(後面參數不加, 就會讀到此行結束), fread 讀到的是 "abcdefg\n12" (\n 算一個 bytes), 就是看到的結果囉~

使用的時機就自行看情況囉~ 若讀的檔案太大, 建議使用 fgets. :)

相關標籤

this is comment icon 請教抓取一行的文字字串 [回覆]

Hi 宗董,

我這個外行人又來發問了:

如果 file.txt 裡面有以下的資料

http://www.yahoo.com
http://www.google.com

我想用 substr 抓取 7 和 -4 之間的字串,即 yahoo, google

但我發現:

1) 如果 file.txt 是 utf-8 編碼,會抓錯資料
2) 如果 file.txt 是 ansi 編碼,就正常

請問是為什麼呢?

謝謝

Comment by 小木可 (08/06/2008 11:11)

this is comment icon 回 小木可 [回覆]

因為 Windows 記事本存 UTF-8 會有另外多存 BOM.
詳可見: http://plog.longwin.com.tw/programming/2008/06/17/php_check_remove_bom_utf8_2008
那 BOM 是看不到的, 不過還是占 3 bytes. 所以會造成抓錯.
解法:
1. 不要用記事本存檔, 用其它編輯器(Editplus 可以設定存檔時不會自動加上 BOM)
2. 第一行先換行, 從第二行開始抓, 就會是正確的資料了~ :)

Comment by Tsung (08/06/2008 13:43)

this is comment icon [回覆]

解決了,x 的,這個問題卡了我半個小時...

Comment by 小木可 (08/07/2008 10:07)

this is comment icon 回 小木可 [回覆]

jon

嗯嗯, 這個問題如果不知道有 BOM 的話, 大概一個月都解不掉吧.. XD

Comment by Tsung (08/07/2008 15:52)

this is comment icon 有問題想問 [回覆]

你好,請問一下,我現在想要讀取CA SERVER 所發出來的憑證(加解密的公、私鑰)

上面的程式碼要如何去修正

Comment by 甘甘 (07/13/2009 15:59)

this is comment icon 回 甘甘 [回覆]

把 10 改成 20480 之類的吧, 把數字加大就對了~ :)

Comment by Tsung (07/13/2009 16:01)

this is comment icon 讀不出\n [回覆]

我照上面的範例打(其實是直接copy)
可是fread的輸出結果並未分成兩行
而是直接輸出成abcdefg 12
why?

Comment by this (11/01/2009 17:14)

this is comment icon 回 this [回覆]

看看你的文字檔後面是不是有很多空白, 是空白造成的斷行, 而不是本身的 \n.

Comment by Tsung (11/02/2009 09:44)
Add this page to del.icio.us

發表迴響

標題

內容 (限制 1000 字)

暱稱

電子郵件

個人網頁


 authimage


PS: 若無法留言, 請先確認是否有打開 JavaScript, 造成您的困擾, 實在萬分對不起 Orz...(如果無法留言, 勞煩可以發信給我好嗎? 謝謝.)
PS2: 若您的留言被誤判, 我都會再自行看過, 不需要一直重覆張貼~