首頁  >  問答  >  主體

php - 關於fwrite和fread操作同一個文件

$fp = fopen("./log", "a+");
fwrite($fp,"helloworld");
rewind($fp);
var_dump( fread($fp, 10) );
fclose($fp);

執行這段程式碼,檔案裡被寫入了兩個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。或 "w+b", that indicates a binary file. Filenames are limited to
FILENAME_MAX characters. At most FOPEN_MAX files may be open at once.

怪我咯怪我咯2685 天前1772

全部回覆(3)我來回復

  • 巴扎黑

    巴扎黑2017-05-16 12:04:35

    fopen的第二个参数为模式, 有r, w, b, a等模式, 其中a表示append, 也就是附加的意思, 打开时不会清空文件(把EOF指向0), 而是把文件指针指向文件末尾. 所以这个时候如果直接写的话不会覆盖原有的内容. 通过rewind函數將檔案指標指向起點, 這個時候寫會覆蓋原有內容. 例如:

    $fp = open('./log.txt', 'w+');
    fwrite($fp, '12345');
    fclose($fp); // 此时文件的内容一定是'12345', 无论在之前是什么
    $fp = open('./log.txt', 'a+');
    fwrite($fp, '67890');  // 此时文件内容为'1234567890'
    rewind($fp);
    fwrite($fp, 'abcde'); // 此时文件内容为'abcde67890'
    fclose($fp);

    回覆
    0
  • 大家讲道理

    大家讲道理2017-05-16 12:04:35

    有兩個的原因是你是append模式,並沒有清空上一次的helloworld,所以上一次和當前次的都在

    回覆
    0
  • 滿天的星座

    滿天的星座2017-05-16 12:04:35

    fopen("./log", "a+");這句話是說以附加的方式打開可讀寫文件,如果說文件存在,原來的內容會被保留,並且數據是追加到文件末尾的。

    這時候$fp檔案指標指向檔案結尾來操作
    fwrite($fp, '12345');

    這時候直接列印fread($fp, 10)會為空字串,是由於$fp檔案指標指向檔案結尾,指定了長度向後讀取列印肯定為空。
    而如果你加上rewind($fp);倒回檔案指標的位置,這時候你會發現,$fp指標指向了檔案開頭,列印fread($fp, 10)會有結果。

    但是你打開你的log,每次都還是追加在文件末尾寫入了進去。

    回覆
    0
  • 取消回覆