我需要读取潜在大量文本文件的最后一行,而不加载整个文件。我认为我有一个很好的解决方案,但有一个令人困惑的错误。对于大多数条目,函数返回正常,但在一个特定的情况下,它似乎加倍文件的最后一个字母。这是我制定的测试脚本(news.txt的内容是单词“NEWS”):
<?php
echo "file contains: ".file_get_contents('news.txt')."<br/>";
$lastLine = getLastLine("news.txt");
echo "function returns: ".$lastLine;
function getLastLine($filename){
$f = fopen($filename, 'r');
$cursor = -1;
$line = '';
fseek($f, $cursor, SEEK_END);
$char = fgetc($f);
echo "initial read: <br/>"; // DEBUG
echo $cursor." | ".$char." | ".$line."<br/>"; // DEBUG
// test for empty file
if($char === false)
return false;
// Trim trailing newline chars of the file
while ($char === "\n" || $char === "\r" || $char === " ") {
fseek($f, $cursor--, SEEK_END);
$char = fgetc($f);
}
echo "kill new lines: <br/>"; // DEBUG
echo $cursor." | ".$char." | ".$line."<br/>"; // DEBUG
// Read until the start of file or first newline char
echo "running loop: <br/>"; // DEBUG
while ($char !== false && $char !== "\n" && $char !== "\r" ) {
// Prepend the new char
$line = $char . $line;
echo $cursor." | ".$char." | ".$line."<br/>"; // DEBUG
fseek($f, $cursor--, SEEK_END);
$char = fgetc($f);
}
return trim($line);
}
?>
输出如下:
file contains: NEWS
initial read:
-1 | S |
kill new lines:
-1 | S |
running loop:
-1 | S | S
-2 | S | SS
-3 | W | WSS
-4 | E | EWSS
-5 | N | NEWSS
function returns: NEWSS
看起来索引-1和-2是相同的,但是,file_get_contents确认文件的内容只是“新闻”。
我做错了什么?
答案 0 :(得分:1)
所以,我的问题是comp sci中的那些“duh”问题之一。我正在使用$curser--
减少我的诅咒,同时在同一行读取它。结果,我正在阅读诅咒,然后递减......我把它改为--$curser
,现在一切都很好。