fopen 模式 w+ 并读取文件?

fopen mode w+ and reading the file?

我正在研究所有模式并试图了解您可以在哪里应用其中的一些模式,我偶然发现了 w。现在我明白了那个模式是如何工作的,但是 w+ 的目的是什么?显然,如果我们在打开文件后立即使用 fopen,它将不起作用,因为文件将被截断,所以我认为在文件中写入一些内容然后稍后从中读取是很好的,所以我决定像这样测试它:

$handle = fopen('new.txt', 'w+');  
fwrite($handle, '123');  
$file = fread($handle, filesize('new.txt'));  
var_dump($file);  // string '' (length=0)
fclose($handle); 

出于某种原因,它稍后没有读取文件的内容。
有人可以向我解释它适用的地方,我的代码有什么问题吗? filesize returns 3,所以它不会删除文件的内容,我假设 $handle 可能从我们打开文件的那一刻起就被使用并且它没有更新?然后我更加困惑为什么我们要使用模式 w+ 并同时从文件中读取?
编辑: 我什至可以理解如何使用 r+ 在文件中写入内容,然后再次使用 fopen 检查我所写入的内容,如下所示:

$handle = fopen('new.txt', 'r+');  
fwrite($handle, '123');   
$handle = fopen('new.txt', 'r+');  
$file = fread($handle, filesize('new.txt'));  
var_dump($file);  
fclose($handle);  

如果我对w+做同样的事情,它显然只会删除内容,我将无法阅读任何内容?

fopen() with w+ option 在开头打开文件 read/write 并将长度截断为 0。这与写入新的空文件基本相同。

在此处查看 fopen() 用法:http://php.net/manual/en/function.fopen.php

w+主要用于"read back"你写的东西。在您的情况下,您使用的是 fread() 函数,该函数在执行 fwrite() 后从当前位于文件末尾的指针读取 "forward",这可以解释为什么您得到空内容。

我希望这能回答你的问题。

@叶。关于指针是正确的。执行 fwrite 后,指针将位于文件末尾。你需要的是fseek()回到文件开头。

$handle = fopen('new.txt', 'w+');
fwrite($handle, '123');
fseek($handle, 0);
$file = fread($handle, filesize('new.txt'));
var_dump($file);  // string '123' (length=3)
fclose($handle);