最近我已经看到在PHP文档,是fread()有一定的长度,但是,不指定线从开始。任何其他建议吗?

有帮助吗?

解决方案

您不会是能够读取从线X开始,因为线可以是任意长度的。所以,你将不得不从一开始计数的行数读去线X.例如阅读:

<?php
$f = fopen('sample.txt', 'r');
$lineNo = 0;
$startLine = 3;
$endLine = 6;
while ($line = fgets($f)) {
    $lineNo++;
    if ($lineNo >= $startLine) {
        echo $line;
    }
    if ($lineNo == $endLine) {
        break;
    }
}
fclose($f);

其他提示

是的,你可以用 SplFileObject::seek

$file = new SplFileObject('filename.txt');
$file->seek(1000);
for($i = 0; !$file->eof() && $i < 1000; $i++) {
    echo $file->current(); 
    $file->next();
}

这是从 SeekableIterator 界面的方法,而不是要混淆fseek

和因为SplFileObject是迭代,你可以做到这一点,甚至有 LimitIterator

$file = new SplFileObject('longFile.txt');
$fileIterator = new LimitIterator($file, 1000, 2000);
foreach($fileIterator as $line) {
    echo $line, PHP_EOL;
}

再次,这是基于零的,所以它的线1001〜2001年

这里是可能的解决方案:)

<?php
$f = fopen('sample.txt', 'r');
$lineNo = 0;
$startLine = 3;
$endLine = 6;
while ($line = fgets($f)) {
    $lineNo++;
    if ($lineNo >= $startLine) {
        echo $line;
    }
    if ($lineNo == $endLine) {
        break;
    }
}
fclose($f);
?>

好了,你不能使用功能FSEEK寻求合适的位置,因为它用的字节数给出工作。

我认为这是不可能没有某种形式的缓存或通过行会一个接一个的。

如果你正在寻找线,然后,因为它依赖于一个字节偏移,不换行的数量,您不能使用FREAD。实际上,你必须阅读文件,找到换行符,所以不同的功能是比较合适的。 与fgets 将读取文件中的行由行。扔在一个循环,并只捕获你想要的行。

我以前很怕那个...我想这是B计划:S

对于每个 AJAX 请求,我将:

  1. 将我要返回给客户端的行数读入字符串。
  2. 复制 休息 文件到临时文件中。
  3. 返回字符串给客户端。

它很蹩脚,而且对于 10,000 多行文件来说,它可能会相当慢,但我想这比一遍又一遍地读取相同的文件要好,至少临时文件随着每个请求而变得越来越短......不?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top