文件操作问题,谢绝灌水 faq相关贴http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=60591现在没有时间测试,晚上一定补上,呵呵不好意思,先灌一篇 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //删除文件中的一行function Object_deleteRow($delRowNumber,$fileName){ $fileContent =file($fileName); for($i=$delRowNumber;$i<sizeof($fileContent)-1;$i++) { $fileContent[$i]=$fileContent[$i+1]; } $fp = fopen($fileName,"w"); flock($fp,3); for($i=0;$i<sizeof($fileContent)-1;$i++) { fwrite($fp,$fileContent[$i]); } fclose($fp);}删除其中一行(编辑也一样),变成数组后进行操作,我没有比较过其他方法的有略,之前,我怀疑过他的速度,但经过测试,可能我的系统所要操作的文件都不是很大,不会超过2000行。完全达到我们的要求(我们的系统不会很多人浏览,不过我觉得要是很多人浏览也不应该用文本文件)。 我觉得对文本文件进行数组上的操作才能发挥php的优势,php不能想shell那样灵活,毕竟他的函数基于c的I/0操作。 to:xuzuning 不知所云to:hover_online(ξ芎メ) 你说的方法是把文件所有内容都读进内存然后再把所有内容写回回去,而我要的是能不能只修改某一行而避免把所有内容都调入内存,要不然我就不会发200分了。例如我只修改第21行,而其他的行不动,如果文件小都调入内存没关系,如果文件很大就有问题了。我正试图找有没有此类函数或者方法,所以来问的,也有可能根本就不行。似乎写函数只有一个就是fwrite(),而它不能按行写入。不知道有没有高手还有没有别的办法 只读操作某一行,在标准的c里面对文件的操作只有 open,read,write,lseek,close.我觉得你有空看看unix下的shell,我不太清楚gawk为什么对于文本操作的功能如此强大,看了本书,没去研究,我觉得从这个角度考虑考虑! 我也觉得不大可能所以才问的。我只是记得有的开发程序中有像编辑.ini的函数,可以只读取修改某一块。在文件中不存在行的概念,实际存贮中只是一个\n字符而已。那只能全部读取,然后全部保存了明天结帖 我记得readbook程序里面有个文件预览,就是只读取头部内容。php毕竟没有c那么强大。系统自带的记事本打开文件会全部调入内存,大文件将会导致记事本没有响应,但是ultraEdit就不同,它会只调入一部分,不会导致程序失去反映。 http://www.hollyway.com/feeling/ViewWcmCont.asp?nContID=68 拙见:php应该是读入整个文件,然后逐行读取的,这样才有可能操作某行 唠叨老大说的对,关键是数据结构的问题吧 感觉php还不象其它强类型语言那样,把内容读入内存 所以,认为不太可能 不论对于文本文件还是其他文件读取文件都是一样,在你看来是分行,只不过是当读文件读到了“\n”就认为是一行,在这个过程中,本身就是一个分成数组的过程。所以你不可能只操作某个"\n"到另一个"\n"之间的内容,除非你已经知道当前指针的偏移量,读取头部的内容可能不难。 而且从读取文件的数据结构来讲,并不是把所有内容进行直接进行操作,而是操作文件的指针。 看样子都没有能理解我的意思。并不是不能写,而是有一定的限制$fp = fopen($filename,"r+"); //以读写方式打开文件$num = 0; //初始行计数$start = 20; //欲操作的行while(! feof($fp)) { $tell = ftell($fp); //保存开始读取的位置 $buf = fgets($fp,2048); //逐行读取 $num++; if($num == $start) { //假定首行为1 $lf = preg_replace("/(\r?\n)/","\\1",$buf); //取得换行符,linux:\n dos:\r\n $len = strlen($buf); //取得当前行长 $formt = sprintf("%%%ds$s",$len-strlen($lf),$lf);//构造一个形如"%12s\r\n"的格式串 $buf = sprintf($formt,$out);//改写为$out的内容,注意这里产生的新串必须与原串相同长度相同,可能用str_pad更好些。 fseek($fp,$tell); //回绕当行开始处 fputs($fp,$buf); //把新串写入文件 break; }}fclose($fp);当然你也可以把待修改处以后的内容逐块移动你也可以建立索引文件记录每行开始的位置处理方法真是太多了...有写朋友建议使用数据库,其实数据库也是操作文件。只是人家替你做好了而已。 还是正则表达式问题! 哪里的设置问题,文件上传报错7 PHP获取淘宝单个商品信息 页面跳转后 火狐显示数据 IE没有数据 Php中的转码问题? 新手问一个关于php连接数据库的问题 PHP5 DOM生成XML,中文乱码怎么解决? 有认为:产品分类数据设计采用parentID的无限级分类的方法不好,这确实也有问题,读取某一大类下的所有产品就很麻烦了,请问怎样设计更合 网页之间不能传递变量 为什么? input的name和数据库里面字段col如何做对应的映射呢? php连Access有没有人试过? 主机遇到奇怪的问题
function Object_deleteRow($delRowNumber,$fileName)
{
$fileContent =file($fileName);
for($i=$delRowNumber;$i<sizeof($fileContent)-1;$i++)
{
$fileContent[$i]=$fileContent[$i+1];
}
$fp = fopen($fileName,"w");
flock($fp,3);
for($i=0;$i<sizeof($fileContent)-1;$i++)
{
fwrite($fp,$fileContent[$i]);
}
fclose($fp);
}
删除其中一行(编辑也一样),变成数组后进行操作,我没有比较过其他方法的有略,之前,我怀疑过他的速度,但经过测试,可能我的系统所要操作的文件都不是很大,不会超过2000行。完全达到我们的要求(我们的系统不会很多人浏览,不过我觉得要是很多人浏览也不应该用文本文件)。
我觉得对文本文件进行数组上的操作才能发挥php的优势,php不能想shell那样灵活,毕竟他的函数基于c的I/0操作。
to:hover_online(ξ芎メ) 你说的方法是把文件所有内容都读进内存然后再把所有内容写回回去,而我要的是能不能只修改某一行而避免把所有内容都调入内存,要不然我就不会发200分了。例如我只修改第21行,而其他的行不动,如果文件小都调入内存没关系,如果文件很大就有问题了。
我正试图找有没有此类函数或者方法,所以来问的,也有可能根本就不行。
似乎写函数只有一个就是fwrite(),而它不能按行写入。不知道有没有高手还有没有别的办法
我觉得你有空看看unix下的shell,我不太清楚gawk为什么对于文本操作的功能如此强大,看了本书,没去研究,我觉得从这个角度考虑考虑!
我只是记得有的开发程序中有像编辑.ini的函数,可以只读取修改某一块。
在文件中不存在行的概念,实际存贮中只是一个\n字符而已。
那只能全部读取,然后全部保存了
明天结帖
系统自带的记事本打开文件会全部调入内存,大文件将会导致记事本没有响应,但是ultraEdit就不同,它会只调入一部分,不会导致程序失去反映。
唠叨老大说的对,关键是数据结构的问题吧
感觉php还不象其它强类型语言那样,把内容读入内存
所以,认为不太可能
读取头部的内容可能不难。
而且从读取文件的数据结构来讲,并不是把所有内容进行直接进行操作,而是操作文件的指针。
$num = 0; //初始行计数
$start = 20; //欲操作的行
while(! feof($fp)) {
$tell = ftell($fp); //保存开始读取的位置
$buf = fgets($fp,2048); //逐行读取
$num++;
if($num == $start) { //假定首行为1
$lf = preg_replace("/(\r?\n)/","\\1",$buf); //取得换行符,linux:\n dos:\r\n
$len = strlen($buf); //取得当前行长
$formt = sprintf("%%%ds$s",$len-strlen($lf),$lf);//构造一个形如"%12s\r\n"的格式串
$buf = sprintf($formt,$out);//改写为$out的内容,注意这里产生的新串必须与原串相同长度相同,可能用str_pad更好些。
fseek($fp,$tell); //回绕当行开始处
fputs($fp,$buf); //把新串写入文件
break;
}
}
fclose($fp);当然你也可以把待修改处以后的内容逐块移动
你也可以建立索引文件记录每行开始的位置
处理方法真是太多了...有写朋友建议使用数据库,其实数据库也是操作文件。只是人家替你做好了而已。