唠叨老大以前写的$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);

解决方案 »

  1.   

    为什么不用数据库来实现,文件文件不好操作,你看上面的一大堆代码就是数据库中两三条语句
    update table set adfas='1231" where adfas="11111'
    这样可乐而不为呢
      

  2.   

    东西很小,觉得不值得用数据库,谁帮我看看代码那里错了,提交以后出现了很奇怪的东西。
    $poll=file("poll.txt");//poll.txt中存放投票数
    $option=file("option.txt");//投票选项
    $poll[$value]=$poll[$value]+1;//$value=$_POST[];票数加一
    $max=count($poll)-1;//
    for($p=0;$p<=$max;$p++){
    $string.=$poll[$p]."\r\n";
    }
    $string.=$poll[$max];//把poll.txt文件读到一个数组中
    unlink("poll.txt");//删除poll.txt
    $fp=@fopen("poll.txt", "w");//新建文件并以写入方式打开
    @fwrite($fp,$string);写入数据
    @fclose($fp);
    $poll=file("poll.txt");//再读一次
    for($i=0;$i<=$max;$i++){
    $all=$poll[$i]+$all;
    }//总记录数
    echo "<html><title>投票结果</title><body><table width=\"500\">";
    for($n=0;$n<=$max;$n++){
        echo "<tr><td align=left>";
    for($t=0;$t<=@floor(($poll[$n]/$all)*50);$t++){
    echo"*";//输出一个大致的图形
    }
        echo "</td><td>".$poll[$n]."票".@floor(($poll[$n]/$all)*100)."% | $option[$n]</td></tr>";//输出票数和所占的比例
    }
    echo "</table></html>";
    比如原来poll.txt是这样的:
    1
    1
    1
    1
    1
    提交一次以后
    变成这样的了:
    2
    1111
    中间多出了很多空行.
    不知道是怎么回事??
      

  3.   

    看了看手册,自己把问题解决了,这里出错了
    for($p=0;$p<=$max;$p++){
    $string.=$poll[$p]."\r\n";
    }
    手册上是这样说的:
    file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。
    我后面加的\r\n是多余的.
      

  4.   

    unlink("poll.txt");//删除poll.txt 
    这句是没有必要的,因为
    $fp=@fopen("poll.txt", "w");
    就已经把它清空了