使用PHP,可以使用fopen
和fgets
读取文件的内容。每次调用fgets
时,它都会返回文件中的下一行。
fgets
如何知道要读取的行?换句话说,它如何知道它最后读取第5行,所以它应该这次返回第6行的内容?我有办法访问该行号数据吗?
(我知道通过使用file
将文件的全部内容读入数组可以做类似的事情,但我想用fopen
完成此操作。)
答案 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)];