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. 🙂

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈PHP: 讀取檔案 fgets 和 fread 的差異〉中有 13 則留言

  1. 你好,請問一下,我現在想要讀取CA SERVER 所發出來的憑證(加解密的公、私鑰)
    上面的程式碼要如何去修正

  2. $articleNum = "abcdef";
    $temp;
    $test = $articleNum;

    echo $articleNum."";
    $file = 'favorite/321.txt';
    print "1------------------- ";
    if (file_exists($file))//檢查檔案是否存在
    {
    print "2------------------- ";
    $fp = fopen($file,"a+");
    $lines = file($file);
    foreach($lines as $line_num => $line)
    {
    $temp[$line_num] = $line;
    echo gettype($temp[$line_num])."-------------------";
    //收藏文章
    }
    print "=============================================";
    if(in_array($test,$temp))
    {
    print "find it on temp---------";
    }
    else{}
    print "3------------------- ";
    }
    (以上為程式碼)
    我有個php記事本的問題 能否給個指導
    我將記事本的資料用 foreach 把每行的資料分別存入陣列 temp
    然後用 in_array 來判斷 abcdef 是否存在陣列裡
    可是為什麼都無法判斷 明明存在陣列裡
    而如果改用 123456789(沒加雙引號) 卻能判斷他是否存在
    (以下為記事本內容)
    123456789
    654987321
    abcdef

    1. 太好了 感謝你~~
      之前有想過他是不是把斷行也讀進去
      然後試了好久 仍然沒結果
      沒想到 trim() 能起作用

  3. Tsung您好:

    遇到一個情形,有點哭笑不得:使用fread讀取檔案,其length只能讀到2000個字元,不管length數字設到多大或多小都沒用,請問這可能跟php設定有關嗎?

    **讀取的是文字檔,我承認它相當大,有500KB,不過我記得有做過更大的。

    1. 才 500k 應該不會有問題耶.

      查看看 php.ini post_max_size, upload_max_filesize 之類的, 是不是有參數把記憶體限制住了?

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料