程式在寫時, 何時要用 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. 🙂
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 編碼,就正常
請問是為什麼呢?
謝謝
因為 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. 第一行先換行, 從第二行開始抓, 就會是正確的資料了~ 🙂
解決了,x 的,這個問題卡了我半個小時...
嗯嗯, 這個問題如果不知道有 BOM 的話, 大概一個月都解不掉吧.. XD
你好,請問一下,我現在想要讀取CA SERVER 所發出來的憑證(加解密的公、私鑰)
上面的程式碼要如何去修正
把 10 改成 20480 之類的吧, 把數字加大就對了~ 🙂
我照上面的範例打(其實是直接copy)
可是fread的輸出結果並未分成兩行
而是直接輸出成abcdefg 12
why?
看看你的文字檔後面是不是有很多空白, 是空白造成的斷行, 而不是本身的 \n.
$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
foreach 塞入陣列前, 作一下這件事情看看:
$line = trim($line);
太好了 感謝你~~
之前有想過他是不是把斷行也讀進去
然後試了好久 仍然沒結果
沒想到 trim() 能起作用
Tsung您好:
遇到一個情形,有點哭笑不得:使用fread讀取檔案,其length只能讀到2000個字元,不管length數字設到多大或多小都沒用,請問這可能跟php設定有關嗎?
**讀取的是文字檔,我承認它相當大,有500KB,不過我記得有做過更大的。
才 500k 應該不會有問題耶.
查看看 php.ini post_max_size, upload_max_filesize 之類的, 是不是有參數把記憶體限制住了?