【发布时间】: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']]);