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

如何 fgets 知道 读什么行?换句话说,它如何知道它上次读取的是第 5 行,所以这次应该返回第 6 行的内容?有没有办法让我访问该行号数据?

(我知道可以通过将文件的全部内容读入数组来执行类似的操作 file, ,但我想通过以下方式完成此任务 fopen.)

有帮助吗?

解决方案

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

您可以通过以下方式获得此职位 ftell, ,并修改为 fseek :

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

fseek — 搜索文件指针

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


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


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

其他提示

文件只是数据流,从一开始到结束读出。操作系统会记住在该文件中,到目前为止您已经阅读的位置。如果需要,可在应用程序这样做也相当简单。该操作系统只关心字节位置虽然不是线。

试想处理按序52卡的甲板。你手头宽裕的第一张牌。下一次的2卡。当你想给了3卡,你并不需要开始从一开始重新计数,甚至回忆你在哪里,你刚刚到手了下一个可用的网卡,这将是第三次。

这可能是对阅读行需要更多的工作,因为你希望缓存从性能与着想的实际文件中读取数据,但它不是给它远不止记录的最后一块的偏移你递出的数据,查找下一个新行字符和挂断所有这些2个点之间的数据。

PHP也不是操作系统有没有真正的需要,以保持行号左右,因为所有的系统在乎的是“下一行”。如果你想知道的行号,你保留一个计数器,每您的应用程序读取一行时加一。

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

}

我甲肝这个老样本滚刀我它可以帮助你:)

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

$linenr = 5;

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

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

您可以只调用fgets并在每次调用时增加一个变种$line_number。这会告诉你,行是打开的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top