PHP从文件末尾读取添加字符


PHP read from end of file adding character

我需要读取一个潜在的巨大文本文件的最后一行,而不加载整个文件。我想我已经制定了一个很好的解决方案,但有一个令人困惑的bug。对于大多数条目,函数都会正确返回,但在一种特定情况下,它似乎会使文件的最后一个字母加倍。这是我编写的测试脚本(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确认文件的内容只是"NEWS"。

我做错了什么?

所以,我的问题是compsci中的"duh"问题之一。我使用$curser--来减少我的curser,同时在同一行中读取它。结果,我在读curser,然后递减。。。我把它改成了--$curser,现在一切都很好。