0

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

怎么fgets 知道读哪一行?换句话说,它怎么知道它最后读取了第 5 行,所以这次它应该返回第 6 行的内容呢?有没有办法让我访问该行号数据?

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

4

4 回答 4

7

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

您可以使用 获得此位置ftell,并使用 修改它fseek

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

fseek — 查找文件指针

您还可以使用带来...倒带...该指针的位置。


这不是让您获得作为行号的位置,而是更接近作为字符编号的位置(实际上,您获得的位置是从文件开头开始的字节数);当你拥有它时,读取一行只是读取字符的一米,直到你遇到行尾字符。


顺便说一句:据我所知,这些函数来自 C 语言——PHP 本身是用 C 语言编写的 ;-)

于 2009-08-29T23:05:06.937 回答
3

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

想象一下按顺序发一副 52 张牌。你交出第一张牌。2.下次卡。3. 发卡的时候,不需要从头开始数,甚至不记得自己在哪里,只要发下一张可用的卡,那就是第三张了。

读取行可能需要做更多的工作,因为您希望缓冲从实际文件中读取的数据以提高性能,但这并没有比记录最后一条数据的偏移量更多分发,找到下一个换行符并移交这两个点之间的所有数据。

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

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

}
于 2009-08-29T23:10:33.570 回答
0

每次调用它时,您都可以调用fgets并增加一个 var 。$line_number那会告诉你它在哪条线上。

于 2009-08-30T01:06:32.527 回答
0

我有这个旧样品我滚它可以帮助你:)

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

$linenr = 5;

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

echo $array[($linenr-1)];
于 2009-08-30T01:21:09.837 回答