怎么在不读取全部文件内容的前提下倒序取出文件的最后几条数据

WBOY
Freigeben: 2016-06-13 12:51:00
Original
804 Leute haben es durchsucht

如何在不读取全部文件内容的前提下倒序取出文件的最后几条数据

<br />
如何在不读取全部文件内容的前提下倒序取出文件的最后几条数据?<br />
<br />
Demo:<br />
Filename:menu.txt<br />
Content:<br />
aaaaaaaa<br />
bbbbbbbb<br />
cccccccc<br />
dddddddd<br />
eeeeeeee<br />
<br />
Result:(取出最后3条)<br />
$res = array(<br />
  array("eeeeeeee"),<br />
  array("dddddddd"),<br />
  array("cccccccc"),<br />
);<br />
Nach dem Login kopieren

------解决方案--------------------
$filename = "menu.txt";//文件名<br />
$handle = fopen( $filename, "rb" );<br />
if( fseek( $handle, 0, SEEK_END ) !== -1 ){//指向文件尾<br />
	$k = 3;//获取的条数<br />
	$s = 0;<br />
	while( $k-- ){<br />
		if ( fseek( $handle, $s-1, SEEK_END ) === -1 ) break;//指针向前移动一个位置<br />
		while( fgetc($handle)!="\n" ){<br />
			--$s;<br />
			fseek( $handle, $s, SEEK_END );<br />
		}<br />
		fseek( $handle, $s+1, SEEK_END );//指针后移一位<br />
		echo fgets($handle) . "<br/>";<br />
	}<br />
}else{<br />
	echo 'no';<br />
}
Nach dem Login kopieren

楼主可以看看
------解决方案--------------------
本帖最后由 xuzuning 于 2012-11-21 12:46:50 编辑

$n = 3;//取3行<br />
$fp = fopen('menu.txt', 'r');//打开文件<br />
fseek($fp, -1, SEEK_END);//跳到最后一个字节出<br />
$res = array();//初始化结果数组<br />
$t = '';//初始化缓冲区<br />
while($n && $ch = fgetc($fp)) {//循环读取<br />
  switch($ch) {<br />
    case "\n":<br />
    case "\r"://是行尾<br />
      if($t) {<br />
        array_unshift($res, $t);//保存缓冲区<br />
        $n--;<br />
      }<br />
      $t = '';<br />
      break;<br />
    default:<br />
      $t = $ch . $t;//缓存字符<br />
  }<br />
  fseek($fp, -2, SEEK_CUR);//向前跳2的字符<br />
}<br />
print_r($res);
Nach dem Login kopieren
Array
(
    [0] => cccccccc
    [1] => dddddddd
    [2] => eeeeeeee
)

------解决方案--------------------

print_r(invertedReadFile('menu.txt', 3));<br>
<br>
function invertedReadFile($filename,$n=20){<br>
    $fp = fopen($filename, 'r');//打开文件<br>
    if (!$fp) return false;<br>
    fseek($fp, -1, SEEK_END);//跳到最后一个字节出<br>
    $res = array();//初始化结果数组<br>
    $t = '';//初始化缓冲区<br>
    while($n && $ch = fgetc($fp)) {//循环读取<br>
      switch($ch) {<br>
        case "\n":<br>
        case "\r"://是行尾<br>
          if($t) {  #这里是否是判断$n为真?<br>
            array_unshift($res, $t);//保存缓冲区<br>
            $n--;<br>
          }<br>
          $t = ''; <div class="clear">
                 
              
              
        
            </div>
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!