$fp = fopen("./log", "a+");
fwrite($fp,"helloworld");
rewind($fp);
var_dump( fread($fp, 10) );
fclose($fp);
執(zhí)行這段代碼,文件里被寫(xiě)入了兩個(gè)helloworld,這是為什么?
還有就是這段話怎么理解:
Update mode permits reading and writing the same file; fflush or a
file-positioning function must be called between a read and a write or
vice versa. If the mode includes b after the initial letter, as in
"rb" or "w b", that indicates a binary file. Filenames are limited to
FILENAME_MAX characters. At most FOPEN_MAX files may be open at once.
走同樣的路,發(fā)現(xiàn)不同的人生
fopen
的第二個(gè)參數(shù)為模式, 有r
, w
, b
, a
等模式, 其中a
表示append
, 也就是附加的意思, 打開(kāi)時(shí)不會(huì)清空文件(把EOF
指向0), 而是把文件指針指向文件末尾. 所以這個(gè)時(shí)候如果直接寫(xiě)的話不會(huì)覆蓋原有的內(nèi)容. 通過(guò)rewind
函數(shù)將文件指針指向起點(diǎn), 這個(gè)時(shí)候?qū)憰?huì)覆蓋原有內(nèi)容. 比如:
$fp = open('./log.txt', 'w+');
fwrite($fp, '12345');
fclose($fp); // 此時(shí)文件的內(nèi)容一定是'12345', 無(wú)論在之前是什么
$fp = open('./log.txt', 'a+');
fwrite($fp, '67890'); // 此時(shí)文件內(nèi)容為'1234567890'
rewind($fp);
fwrite($fp, 'abcde'); // 此時(shí)文件內(nèi)容為'abcde67890'
fclose($fp);
有兩個(gè)的原因是你是append模式,并沒(méi)有清空上一次的helloworld,所以上一次和當(dāng)前次的都在
fopen("./log", "a+");這句話是說(shuō)以附加的方式打開(kāi)可讀寫(xiě)文件,如果說(shuō)文件存在,原來(lái)的內(nèi)容會(huì)被保留,并且數(shù)據(jù)是追加到文件末尾的。
這時(shí)候$fp文件指針指向文件末尾來(lái)操作
fwrite($fp, '12345');
這時(shí)候直接打印fread($fp, 10)會(huì)為空字符串,是由于$fp文件指針指向文件末尾,指定了長(zhǎng)度向后讀取打印肯定為空。
而如果你加上rewind($fp);倒回文件指針的位置,這時(shí)候你會(huì)發(fā)現(xiàn),$fp指針指向了文件開(kāi)頭,打印fread($fp, 10)會(huì)有結(jié)果。
但是你打開(kāi)你的log,每次都還是追加在文件末尾寫(xiě)入了進(jìn)去。