这样可能解决//PHP版本,很容易改写为C版本//更新文件中的某一行
function update_fline($fp, $mid, $points, $point_time)
{
       $buff = $c = '';
       $offset_head = $offset_tail = 0;        //相应行的开始位置和结束位置(距文件开始位置的字节数)
        $is_head = $is_tail = 0;        //是否到达了要求的行的开始位置和结束位置
        $comma = 0;        //逗号的位置标志        rewind($fp);        //查找相应行
        while(($c = fgetc($fp)) !== false) {
                $is_head || $offset_head++;
                $offset_tail++;                //$buff中只存储每行第一个,前的数据,即MISC_MID
                if($c != ',' && !$comma) 
                        $buff .= $c;
                else {
                        if(!$is_head && $c == ',')
                            (++$comma == 1) && (strcmp($buff, $mid)) || ($is_head = 1);
                        else if($c == '\n') {        //开始读新的一行
                                $comma = 0;
                                if(!$is_head)
                                        ($buff) && ($buff = '');
                                else     $is_tail = 1;
                        }
                }                $is_tail && break;        //读到相应行的结尾,停止继续读
        }       fseek($fp, $offset_head);        //定位文件指针到相应行的开始位置        list(, , $points_old,) = fgetcsv($fp, $offset_tail-$offset_head);        //读取原来的积分
        $points += $points_old;
       fwrite($fp, "$mid,1,$points,$point_tmp");
}

解决方案 »

  1.   

    小时候偶们学编程,老师讲系统是咋操作文件的,偶们现在还记得。对大文件的操作,通常都需要一个临时文件的,边读老文件,边写入新文件。你读老文件是,发现不要的行,就别写进新文件了,这样不就行了。同时,推荐你用sqlite,不管怎么说,10万行。你不用数据库,不加索引,执行效率总归不行吧
      

  2.   

    读老文件的时候,一行一行地读,写临时文件时,一行一行地写,最原始的文件copy操作不都这样做的么?只是后来人们加入了各种库,方便了大家
      

  3.   

    to joycheney:谢谢。但不可行。
    首先,有几十个这样的文件,每个文件的读操作和写操作都有并发,在这种情况下,写入临时文件,然后删除、改名等,显然不可行,而且你的方案极易产生碎片。
    而且执行频率很高,并且需要实时更新和显式,这样显然不能使用数据库。
      

  4.   

    几十个几十万数据的单个文件不用数据库,N多次操作,恐怕是数据库的执行效率要高于读写文件吧?首先定位数据,数据库加了索引的,你手工搜索,除非你用了B+树等索引,不然再怎么快也快不过数据库吧?你先试试sqlite再说吧,文件型数据库,跟你操作文件差不多,而且速度不错
      

  5.   

    一般文件型数据库,没有网络连接的开销(比如MySQL, SQL Server等),没有COM调用的开销(ACCESS),应该都不会比你手工修改慢的,否则数据库拿来做什么呢?人家研究那么多索引算法,几个月如一日的,不要彻底否定人家嘛
      

  6.   

    呵呵,在可以自由选择DBMS时,确实是这样。
    谢谢joycheney。关于文件,是做了索引处理和并发控制。