如何在不读取全部文件内容的前提下倒序取出文件的最后几条数据 如何在不读取全部文件内容的前提下倒序取出文件的最后几条数据?Demo:Filename:menu.txtContent:aaaaaaaabbbbbbbbccccccccddddddddeeeeeeeeResult:(取出最后3条)$res = array( array("eeeeeeee"), array("dddddddd"), array("cccccccc"),); 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 将文件的指针移动到你要开始读取的位置(利用fseek()函数),然后读取文件。 $filename = "menu.txt";//文件名$handle = fopen( $filename, "rb" );if( fseek( $handle, 0, SEEK_END ) !== -1 ){//指向文件尾 $k = 3;//获取的条数 $s = 0; while( $k-- ){ if ( fseek( $handle, $s-1, SEEK_END ) === -1 ) break;//指针向前移动一个位置 while( fgetc($handle)!="\n" ){ --$s; fseek( $handle, $s, SEEK_END ); } fseek( $handle, $s+1, SEEK_END );//指针后移一位 echo fgets($handle) . "<br/>"; }}else{ echo 'no';}楼主可以看看 本帖最后由 xuzuning 于 2012-11-21 12:46:50 编辑 1、如何是在第一次读取后,文件又加了内容,第二次读取更新的内容?Demo2:filename:menu.txtcontent:aaaaaaaabbbbbbbbccccccccddddddddeeeeeeeeffffffffggggggggresult:array( array("gggggggg"), array("ffffffff"));2、如何从指定行倒序读取指定行数?Demo3:filename:menu.txtcontent:aaaaaaaabbbbbbbbccccccccddddddddeeeeeeeeffffffffggggggggresult: (从倒数第2行,读取3行数据)array( array("ffffffff"), array("eeeeeeee"), array("dddddddd")); 1、如何是在第一次读取后,文件又加了内容,第二次读取更新的内容?保存上次读取时的文件大小 $sizefseek($fp, $size);然后用 fgets 正序读取,array_unshift 逆序保存2、如何从指定行倒序读取指定行数?从倒数第2行,读取3行数据简单的逻辑判断,倒序读取5行,不保存前2行 在windows下的文件中貌似没有\d,不走switch中的case "\d"。貌似是“\r\n”,但如何执行这段代码?if($t) { array_unshift($res, $t);//保存缓冲区 $n--; } $t = ''; case 是顺序执行的,所以要有 break 跳出 #我将#4楼的带面封装了下,总是返回空数组,为题在于$t开始就是空的,没有其他赋值的地方function invertedReadFile($filename,$n=20){ $fp = fopen($filename, 'r');//打开文件 if (!$fp) return false; fseek($fp, -1, SEEK_END);//跳到最后一个字节出 $res = array();//初始化结果数组 $t = '';//初始化缓冲区 while($n && $ch = fgetc($fp)) {//循环读取 switch($ch) { case "\n": case "\r\n" || "\r"://是行尾 #echo "-->>4<br>"; if($t) { #这里是否是判断$n为真? array_unshift($res, $t);//保存缓冲区 echo "res-->>";print_r($res);echo "<br>"; $n--; } $t = ''; break; default: #echo "-->>5<br>"; $t = $ch . $t;//缓存字符 #这里的$t和最终结果有什么关系? } fseek($fp, -2, SEEK_CUR);//向前跳2的字符 } return $res;} print_r(invertedReadFile('menu.txt', 3));function invertedReadFile($filename,$n=20){ $fp = fopen($filename, 'r');//打开文件 if (!$fp) return false; fseek($fp, -1, SEEK_END);//跳到最后一个字节出 $res = array();//初始化结果数组 $t = '';//初始化缓冲区 while($n && $ch = fgetc($fp)) {//循环读取 switch($ch) { case "\n": case "\r"://是行尾 if($t) { #这里是否是判断$n为真? array_unshift($res, $t);//保存缓冲区 $n--; } $t = ''; break; default: $t = $ch . $t;//缓存字符 #这里的$t和最终结果有什么关系? } fseek($fp, -2, SEEK_CUR);//向前跳2的字符 } return $res;}Array( [0] => cccccccc [1] => dddddddd [2] => eeeeeeee)case "\r\n" || "\r"://是行尾这样写是错误的!语法错,不知为什么php不报错先不说 fgetc 一次返回一个字符,不会出现 "\r\n" 字符组合switch($ch) { case "\n": case "\r":和switch($ch) { case $ch == "\n" || $ch == "\r": //多条件要这样写是等价的表示换行window 用 "\r\n"linux 用 "\n"mac 用 "\r"代码中都涵盖了if($t) 的作用是防止在window中重复执行保存操作 #很是奇怪的问题,我用#3的方法获得了结果function aaa($filename, $k=20){ $handle = fopen( $filename, "rb" ); if( fseek( $handle, 0, SEEK_END ) !== -1 ){//指向文件尾 $s = 0; $res = array(); while( $k-- ){ if ( fseek( $handle, $s-1, SEEK_END ) === -1 ) break;//指针向前移动一个位置 while( fgetc($handle)!="\n" ){ --$s; fseek( $handle, $s, SEEK_END ); } fseek( $handle, $s+1, SEEK_END );//指针后移一位 $res[] = fgets($handle); } return $res; }else{ return false; }}#但是#12的方法运行后一直是返回空数组:Array();就是if($t){}没进来。$t=''; 之后没有赋值,一直为null所以if($t)不成立。 php 生成iframe静态页 PHP可不可以读取IE可FF中的cookie 假如我有100万用户,要创建100万个文件夹. .htaccess URL替换空格 鼠标失去焦点自动保存广西框中的内容 请教一个问题,如何将两个变量“粘”在一起? 我刚学PHP,遇到个小问题,请大家指教一下。 一个小问题 谁知道写屏聊天室的核心技术啊。怎么写啊,最好说的详细些啊,谢谢!! 请问在哪里下载Apache1.3.19 和 php4.0.6 留言板上表情的添加 trie 的应用
$handle = fopen( $filename, "rb" );
if( fseek( $handle, 0, SEEK_END ) !== -1 ){//指向文件尾
$k = 3;//获取的条数
$s = 0;
while( $k-- ){
if ( fseek( $handle, $s-1, SEEK_END ) === -1 ) break;//指针向前移动一个位置
while( fgetc($handle)!="\n" ){
--$s;
fseek( $handle, $s, SEEK_END );
}
fseek( $handle, $s+1, SEEK_END );//指针后移一位
echo fgets($handle) . "<br/>";
}
}else{
echo 'no';
}
楼主可以看看
1、如何是在第一次读取后,文件又加了内容,第二次读取更新的内容?
Demo2:
filename:menu.txt
content:
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
eeeeeeee
ffffffff
ggggggggresult:
array(
array("gggggggg"),
array("ffffffff")
);
2、如何从指定行倒序读取指定行数?
Demo3:
filename:menu.txt
content:
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
eeeeeeee
ffffffff
ggggggggresult: (从倒数第2行,读取3行数据)
array(
array("ffffffff"),
array("eeeeeeee"),
array("dddddddd")
);
保存上次读取时的文件大小 $size
fseek($fp, $size);
然后用 fgets 正序读取,array_unshift 逆序保存2、如何从指定行倒序读取指定行数?
从倒数第2行,读取3行数据
简单的逻辑判断,倒序读取5行,不保存前2行
貌似是“\r\n”,但如何执行这段代码?
if($t) {
array_unshift($res, $t);//保存缓冲区
$n--;
}
$t = '';
#我将#4楼的带面封装了下,总是返回空数组,为题在于$t开始就是空的,没有其他赋值的地方function invertedReadFile($filename,$n=20){
$fp = fopen($filename, 'r');//打开文件
if (!$fp) return false;
fseek($fp, -1, SEEK_END);//跳到最后一个字节出
$res = array();//初始化结果数组
$t = '';//初始化缓冲区
while($n && $ch = fgetc($fp)) {//循环读取
switch($ch) {
case "\n":
case "\r\n" || "\r"://是行尾
#echo "-->>4<br>";
if($t) { #这里是否是判断$n为真?
array_unshift($res, $t);//保存缓冲区
echo "res-->>";print_r($res);echo "<br>";
$n--;
}
$t = '';
break;
default:
#echo "-->>5<br>";
$t = $ch . $t;//缓存字符 #这里的$t和最终结果有什么关系?
}
fseek($fp, -2, SEEK_CUR);//向前跳2的字符
}
return $res;
}
$fp = fopen($filename, 'r');//打开文件
if (!$fp) return false;
fseek($fp, -1, SEEK_END);//跳到最后一个字节出
$res = array();//初始化结果数组
$t = '';//初始化缓冲区
while($n && $ch = fgetc($fp)) {//循环读取
switch($ch) {
case "\n":
case "\r"://是行尾
if($t) { #这里是否是判断$n为真?
array_unshift($res, $t);//保存缓冲区
$n--;
}
$t = '';
break;
default:
$t = $ch . $t;//缓存字符 #这里的$t和最终结果有什么关系?
}
fseek($fp, -2, SEEK_CUR);//向前跳2的字符
}
return $res;
}Array
(
[0] => cccccccc
[1] => dddddddd
[2] => eeeeeeee
)case "\r\n" || "\r"://是行尾
这样写是错误的!语法错,不知为什么php不报错
先不说 fgetc 一次返回一个字符,不会出现 "\r\n" 字符组合
switch($ch) {
case "\n":
case "\r":
和
switch($ch) {
case $ch == "\n" || $ch == "\r": //多条件要这样写
是等价的表示换行
window 用 "\r\n"
linux 用 "\n"
mac 用 "\r"
代码中都涵盖了if($t) 的作用是防止在window中重复执行保存操作
#很是奇怪的问题,我用#3的方法获得了结果
function aaa($filename, $k=20){
$handle = fopen( $filename, "rb" );
if( fseek( $handle, 0, SEEK_END ) !== -1 ){//指向文件尾
$s = 0;
$res = array();
while( $k-- ){
if ( fseek( $handle, $s-1, SEEK_END ) === -1 ) break;//指针向前移动一个位置
while( fgetc($handle)!="\n" ){
--$s;
fseek( $handle, $s, SEEK_END );
}
fseek( $handle, $s+1, SEEK_END );//指针后移一位
$res[] = fgets($handle);
}
return $res;
}else{
return false;
}
}#但是#12的方法运行后一直是返回空数组:Array();
就是if($t){}没进来。
$t=''; 之后没有赋值,一直为null
所以if($t)不成立。