如何判断PHP中当前“on”文件资源的哪一行?

时间:2009-08-29 23:00:45

标签: php file line fopen

使用PHP,可以使用fopenfgets读取文件的内容。每次调用fgets时,它都会返回文件中的下一行。

fgets 如何知道要读取的行?换句话说,它如何知道它最后读取第5行,所以它应该这次返回第6行的内容?我有办法访问该行号数据吗?

(我知道通过使用file将文件的全部内容读入数组可以做类似的事情,但我想用fopen完成此操作。)

4 个答案:

答案 0 :(得分:6)

打开每个文件的内存中都有一个“位置”;每次从文件中读取一行/字符/任何内容时,它都会自动更新。

您可以使用ftell获取此职位,并使用fseek修改此代码:

  

ftell - 返回当前位置   文件读/写指针

     

fseek - 寻找文件指针

您还可以使用rewind来...回放...指针的位置。


这不是一个行号作为行号,而是作为一个字符号更接近一个位置(实际上,你从文件开头得到的位置是一个字节数);当你有这个时,读一行只是一个读字符的元素,直到你遇到一个行尾字符。


BTW:据我记忆,这些函数来自C语言 - PHP本身是用C语言编写的; - )

答案 1 :(得分:3)

文件只是一个数据流,从头到尾读取。操作系统将记住您到目前为止在该文件中读取的位置。如果需要,在应用程序中这样做也很简单。操作系统只关心字节位置,而不是线。

想象一下,按顺序处理一副52张牌。你交出第一张卡片。下次2.卡。当你想要发出3.卡时,你不需要从头开始计数,或者甚至记住你在哪里,只需分发下一张可用的卡,这将是第三张。

读取行可能需要更多的工作,因为为了了解性能,你需要缓冲从实际文件读取的数据,但它并不比记录最后一块的偏移量多得多。你分发的数据,找到下一个换行符并在这两个点之间移交所有数据。

PHP和操作系统没有真正需要保持行号,因为所有系统关心的是“下一行”。如果您想知道行号,您可以保留一个计数器,并在每次应用读取一行时递增它。

$lineno=0;
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    lineno++; // keep track of the line number
     ...

}

答案 2 :(得分:0)

每次调用时,您都可以调用fgets并增加var $line_number。那会告诉你它的线路。

答案 3 :(得分:0)

我有这个旧样本ihob它可以帮助你:)

$File = file('path');
$array = array();

$linenr = 5;

foreach( $File AS $line_num => $line )
{
$array = array_push( $array , $line );
}

echo $array[($linenr-1)];