使用 PHP,可以使用fopen
和读取文件的内容fgets
。每次fgets
调用时,它都会返回文件中的下一行。
怎么fgets
知道读哪一行?换句话说,它怎么知道它最后读取了第 5 行,所以这次它应该返回第 6 行的内容呢?有没有办法让我访问该行号数据?
(我知道可以通过将文件的全部内容读入数组来做类似的事情file
,但我想用 来完成fopen
。)
每个打开的文件都有一个“位置”保存在内存中;每次您从文件中读取一行/字符/任何内容时,它都会自动更新。
您可以使用 获得此位置ftell
,并使用 修改它fseek
:
ftell — 返回文件读/写指针的当前位置
fseek — 查找文件指针
您还可以使用倒带来...倒带...该指针的位置。
这不是让您获得作为行号的位置,而是更接近作为字符编号的位置(实际上,您获得的位置是从文件开头开始的字节数);当你拥有它时,读取一行只是读取字符的一米,直到你遇到行尾字符。
顺便说一句:据我所知,这些函数来自 C 语言——PHP 本身是用 C 语言编写的 ;-)
文件只是一个数据流,从头到尾读取。操作系统会记住您目前在该文件中读取的位置。如果需要,在应用程序中这样做也相当简单。操作系统只关心字节位置,而不关心行。
想象一下按顺序发一副 52 张牌。你交出第一张牌。2.下次卡。3. 发卡的时候,不需要从头开始数,甚至不记得自己在哪里,只要发下一张可用的卡,那就是第三张了。
读取行可能需要做更多的工作,因为您希望缓冲从实际文件中读取的数据以提高性能,但这并没有比记录最后一条数据的偏移量更多分发,找到下一个换行符并移交这两个点之间的所有数据。
PHP 和操作系统都没有真正需要保留行号,因为所有系统关心的是“下一行”。如果您想知道行号,您可以保留一个计数器,并在您的应用程序每次读取一行时递增它。
$lineno=0;
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
lineno++; // keep track of the line number
...
}
每次调用它时,您都可以调用fgets
并增加一个 var 。$line_number
那会告诉你它在哪条线上。
我有这个旧样品我滚它可以帮助你:)
$File = file('path');
$array = array();
$linenr = 5;
foreach( $File AS $line_num => $line )
{
$array = array_push( $array , $line );
}
echo $array[($linenr-1)];