php 指针fseek如何直接把指针放到指定行?

页面导航:
→ 正文内容 PHP移动文件指针函数
PHP移动文件指针ftell()、fseek()、rewind()函数总结
这篇文章主要介绍了PHP移动文件指针ftell()、fseek()、rewind()函数总结,本文先是对它们的作用做了讲解,然后给出具体使用例子,需要的朋友可以参考下
在对文件进行读写过程中,有时需要在文件中跳转、同不同位置读取,以及将数据写入到不同的位置。例如,使用文件模拟数据库保存数据,就需要移动文件指针。指针的位置是以从文件头开始的字节数度量的,默认以不同模式打开文件时,文件指针通常在文件的开头或是结尾处,可以通过ftell()、fseek()和rewind()三个函数对文件指针进行操作,它们的原型如下所示:
int ftell(resource handle)&&&&&&&& //返回文件指针的当前位置
int fseek(resource hanlde,int offset[,int whence])&&&&&&&&& //移动文件指针到指定位置
bool rewind(resource handle)&&&&&&&&& //移动文件指针到文件的开头
使用这些函数时,必须提供一个用fopen()函数打开的、合法的文件指针。函数ftell()获取由指定的资源中的文件指针当前位置的偏移量;函数rewind()将文件指针移回到指定资源的开头;而函数fseek()函数则将指针移动到第二个参数offset指定的位置,如果没有提供第三个可选参数whence,则位置将设置为从文件开头的offset字节处。否则,第三个参数whence可以设置为三个可能的值,它将影响指针的位置。
★SEEK_CUR:设置指针位置为当前位置加上第二个参数所提供的offset字节。
★SEEK_END:设置指针位置为EOF加上offset字节。在这里,offset必须设置为负值。
★SEEK_SET:设置指针位置为offset字节处。这与忽略第三个参数whence效果相同。
如果fseek()函数执行成功,将返回0,失败则返回-1.如果将文件以追加模式“a”或“a+”打开,写入文件的任何数据是会被附加在后面,不会管文件指针的位置。代码如下所示:
$fp = fopen('data.txt' ,'r')or die("文件打开失败");
echo ftell($fp)."&br&";&&&&&&&& //输出刚打开文件的指针默认位置,指针在文件的开头位置为0
echo fread($fp, 10)."&br&";&&&&&&& //读取文件中的前10个字符输出,指针位置发生了变化
echo ftell($fp)."&br&";&&&&&&&&&& //读取文件的前10个字符之后,指针移动的位置在第10个字节处
fseek($fp, 100,SEEK_CUR);&&&&&& //又将指针移动到倒数10个字节位置处
echo ftell($fp); //文件的位置在110个字节处
echo fread($fp,10)."&br&";&&&& //读取110到120字节数位置的字符串,读取后指针的位置为120
fseek($fp,-10,SEEK_END);&&&&&&&& //又将指针移动到倒数10个字节位置处
echo fread($fp, 10)."&br&";&&&&&&& //输出文件中最后10个字符
rewind($fp);&&&&&&&&& //又移动文件指针到文件的开头
echo ftell($fp);&&&&&&&&&& //指针在文件的开头位置,输出0
fclose($fp);
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行PHP读取大文件末尾N行的高效方法 - ThinkPHP框架
小文件几兆以内大小,都可以通过file()函数,将文件按行读入数组,在用array_pop取得最后一行,就可以了。
但是对于很大的文本文件来说,机器内存不够大,或者php本身memory_limit有限制,这个办法就不适用了,即使强行不限制,效率也是非常低的。
没有办法了吗?当然有,不过没有现成的函数了,需要自己动手了。
这里需要用到文件指针,学过C的应该知道指针式个嘛玩意,通俗的讲吧,PHP中通过fopen打开一个文件,这时候还没有读取文件,这时候指向的是文件开头,指针位置也就是0,当你通过fgets或者fgetc从文件中读取内容的时候,你读多少,指针也相应往前进多少,这也是
while(!feof($fp)){
$data.=fgets($fp,4096);
得以实现的原理,即fgets是从当前指针位置向后读取指定长度的字符串,直到遇见换行符为止。
那么可不可以控制指针的位置到倒数第N行位置呢?很遗憾,没有,但是可以将指针直接移动到末尾,并倒退N个位置,通过fseek()函数。
我们先将指针移动到末尾,并向后倒退2个位置,通过fgetc读取一个字符,判断这个字符是不是"\n"也就是换行符,如果不是换行符,那么继续倒退一个位置再次判断,直到我们倒退到上一行的结尾换行符为止,直接使用fgets将一整行都取出来即可。这里面用到两个while循环,外层循环控制需要取得的行数,内层循环控制fseek动作。
函数如下:/**
&*&取文件最后$n行
&*&@param&string&$filename&文件路径
&*&@param&int&$n&最后几行
&*&@return&mixed&false表示有错误,成功则返回字符串
function&FileLastLines($filename,$n){
&&&&if(!$fp=fopen($filename,'r')){
&&&&&&&&echo&"打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文";
&&&&&&&&return&
&&&&$pos=-2;
&&&&$eof="";
&&&&$str="";
&&&&while($n&0){
&&&&&&&&while($eof!="\n"){
&&&&&&&&&&&&if(!fseek($fp,$pos,SEEK_END)){
&&&&&&&&&&&&&&&&$eof=fgetc($fp);
&&&&&&&&&&&&&&&&$pos--;
&&&&&&&&&&&&}else{
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}
&&&&&&&&$str.=fgets($fp);
&&&&&&&&$eof="";
&&&&&&&&$n--;
&&&&return&$
echo&nl2br(FileLastLines('sss.txt',4));
积分:4926
七牛云存储优惠码驾到!
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。php 如何读取指定行数据?_百度知道
php 如何读取指定行数据?
在php中:fgets()多是结合while循环读取整个文件,有个参数,但不是指定行,而是指定字节数,
这在操作一般的TXT是没多大意义的; file()是全部读取,有点浪费内存,而且处抚斑合职骨办摊暴揩反复操作数组也不是一件很爽的事;fseek()也没用,基参数不是指定行;请问高手:有没有一个函数能像asp一样,指定某一行,或上一行下一行,然后读取??
提问者采纳
function get_file_line( $file_name, $line ){
$handle = fopen($file_name,'r');
if ($handle) {
while (!feof($handle)) {处抚斑合职骨办摊暴揩
$out = fgets($handle, 4096);
if($line==$n)
fclose($handle);
if( $line==$n) return $}暂时没想到什么好办法或找到对应函数,抛砖引玉,希望见到更好的解决方案
提问者评价
谢谢楼上的帮助。用这个函数应该是可行的,只是感觉有点浪费资源,要是有一个类似asp的内置函数就好了
其他类似问题
php的相关知识
您可能关注的推广
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁78 PHP视频教程 文件指针控制fseek rewind ftell feof fpassthru_土豆_高清视频在线观看}

我要回帖

更多关于 matlab fseek 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信