【问题标题】:php: fwrite saves before fread even when it is after?php:fwrite 在 fread 之前保存,即使它在它之后?
【发布时间】:2015-03-12 16:33:39
【问题描述】:

这在 php 中很难解释。我有一个读取文件的系统,按行(“\r\n”)分解数据,然后查看这些行并得出一个新数据,而没有一行由 $n 变量标记。然后它会写。

这就是问题所在:它就像 fwrite 是第一个(最后一个),然后是 fread(它是第一个),然后是 fwrite(它是最后一个)。

如果我有一个包含 31 行的文件,fread 将读取该文件,就好像它已经有 30 行并取出了正确的行。然后它会再次取出正确的行,所以我最终会得到一个 29 行的文件。但是如果我删除 fread,31 行文件会正确加载。如果我没有删除一行,那么它将保留所有 31 行。

我已经尽可能地简化了代码。我什至添加了 sleep(10) 以希望延迟 fwrite 直到 fread 读取。

当我输出一个可以正常工作的不同文件时,但如果我尝试获取该输出文件并将其重命名为原始文件,我仍然会遇到同样的问题。我还将 file_get_contents 与 file_put_contents 一起使用,结果相同。

感谢您的帮助。也许你们可以告诉我我哪里出错了。代码如下:

$handle = fopen($filename, 'r'); 
$Data = fread($handle, filesize($filename));
fclose($handle);

$pieces = explode("\r\n", $Data);

// $n = the line to delete

$info = '';
for($i = 0 ; $i < sizeof($pieces) ; $i++){
    if($_REQUEST['n'] == $i && $pieces[$i] != ''){
        $info .= $pieces[$i]."\r\n";
    }
}

// $filename never changes 
// $info is $Data without the specific $n line
$fp = fopen($filename, 'w+');
fwrite($fp, $info);
fclose($fp);

【问题讨论】:

  • 你为什么不干脆做$pieces = file(filename, FILE_IGNORE_NEW_LINES);
  • 我要删除特定行。
  • 然后您可以unset($pieces($_REQUEST['n'])); 删除该特定行
  • 谢谢你,马克,但这并没有解决我的问题的根源,但你确实整理了代码。我会在这里发布代码,但字符限制阻止了我。对于其他想和我一起尝试的人,请将 for 循环替换为 unset($pieces[$_REQUEST['n']]);

标签: php fwrite fread


【解决方案1】:

事实证明,这是 PHP 5.3.3 错误的结果。升级到 PHP 5.6 左右后它不再是问题。

【讨论】:

    猜你喜欢
    • 2017-05-05
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多