我用PHP打开一个包含中文的文本文件,想读取其中的一部分文本:
fseek($fp, 1000);
fread($fp, 1024);
我发现把其中的1000改变下有时读取的是乱码,有时读取的是正确的。这是什么原因?是不是因为文件里包含了英文,而中文占两字节英文占一字节导至设置文件指针出问题?由于文本文件比较大,为了提高性能我不想用filegetcontents,不知道有什么办法实现?

解决方案 »

  1.   

    是不是可以先全部读取到内存,然后用mb_substr之类的方法截取需要的内容呢?
      

  2.   

    因为文件比较大,全部读取太慢了。没什么办法类似fseek定位到指定字符吗?或定位到指定的行也行。
    然后读取文本。
      

  3.   


    做个判断字符的函数fseek($fp, cut_str(1000)); 
    //其中cut_str是你要写的判断函数

    定位后先把这一行全取出来用fseek($fp,10000); $n=filesize('data.txt')>1000?1000:filesize('data.txt');
    fseek($fp,-$n,SEEK_CUR); 
    while($line=fread($fp,$n)){
      if(preg_match("/.+\r?\n+([^\r\n]+)$/",$line,$matches)){
        $text=$matches[1]; //这就是文本中你所定位的那一行数据
        break;
      }
      fseek($fp,-$n*2,SEEK_CUR); 
    }
      

  4.   

    修正一下:
    $x=10000;
    fseek($fp,$x);  
    $n=$x>1000?1000:$x;
    fseek($fp,-$n,SEEK_CUR);  
    while($line=fread($fp,$n)){ 
      if(preg_match("/.+\r?\n+([^\r\n]+)$/",$line,$matches)){ 
        $text=$matches[1]; //这就是文本中你所定位的那一行数据 
        break; 
      } 
      fseek($fp,-$n*2,SEEK_CUR);  
    }
      

  5.   

    5楼的不行呀,这样读取速度很慢,比一行一行读还慢.fseek($fp, cut_str(1000));  
    //其中cut_str是你要写的判断函数 
    这个怎么实现?我是要定位到指定位置的字符但不知道是什么字符.
    比如一个文件里有:aaa中文bbb
    如果用fseek($fp,4)的话就定位到了'中'字的中间了(因为'中'由两个字节组成),这样读取就有乱码的.
    我就想知道这个问题怎么解决.