我正在尝试从txt文件中提取内容。此文件是动态的,因为每次执行循环时数据都会附加到它。 在这个循环内部依赖于我从逻辑中提取内容的逻辑,如下所示......
$length = filesize($filename);
fseek($fd,$previousLength);
$contents = fread($fd,(($length - $previousLength)));
$previousLength = $length;
即,我试图只读取在最后一个循环中附加的数据...而不是之前写入的数据。 示例...每次运行循环时,txt都会添加一个。即考虑
114134, 144, 1443, 1433 ...
(n of these written every once in loop ) ...
如果我读了n个值,请说
114134, 144 ...
在第一个循环......
下次,我只需要阅读
1443, 1443 and NOT 114134, 144 ....
fread()在这里失败了,fseek没有帮助(参考我上面的代码)......
我不知道为什么!!帮助需要尽快......
由于
答案 0 :(得分:0)
不确定我是否正确,但您正在读取您在同一循环中附加的文件中的数据?
您编写的数据是否已添加到文件中的所有单独行?你可以查看file()命令,它会将每一行读入一个数组......然后你可以通过计算前一行中的行,然后是after情况,将array_slice()从数组中排出正确的行。
答案 1 :(得分:0)
如果您已在附加模式下打开文件,则man page for fseek会说:
如果以附加(a或+)模式打开文件,则无论文件位置如何,都会追加写入文件的任何数据,并且调用fseek()的结果将是未定义的。
以下代码有一些修改。我有一些长度问题 - fread确实需要它,但我决定使用fgets来避免它。这将停止换行字符,但具有读取文件的所有剩余内容的便利功能。可能有更好的方法,但这确实有效。
<?php
$filename = 'loopFile.txt';
$previousLength = 0;
$n = 0;
$fw = fopen($filename, 'a+');
$fr = fopen($filename, 'r');
for ($i=0; $i < 15; $i++)
{
// Put a random number of numbers into the file.
$numberOfNumbers = rand(0, 5);
for ($writeCount = 0; $writeCount < $numberOfNumbers; $writeCount++)
{
fwrite($fw, $i . '_' . $n++ . ', ');
}
fseek($fr, $previousLength);
$contents = fgets($fr);
if (!empty($contents))
{
echo 'On iteration: ' . $i . ' read: ' . $contents . "\n";
}
else
{
echo 'On iteration: ' . $i . ' no new data appended to file.' . "\n";
}
$previousLength += strlen($contents);
}
fclose($fw);
fclose($fr);
?>