function readMessage($filename){
     $fp = fopen($filename,"r");
     flock($fp,LOCK_SH);
     $buffer="";
     $buffer.=fread($fp,filesize($filename));
     //echo $buffer;
     $data = explode("<|>",$buffer);
     print_r($data);
     echo isset($data[2]);
    
     foreach ($data as $line){
     if($line !="")
     {
     list($username,$title,$message)= explode("||",$line);
     }
     if($username!=""&&$title!=""&&$message!=""){
     echo $username.'说:';
     echo '&nbsp;'.$title.',';
     echo $message."<br>";
     }
     }
     flock($fp,LOCK_UN);
    
        fclose($fp);
    }这段代码在读取文本信息的时候 是以<|>符号来作为结束符截图每条数据的,每条数据里的属性值是用||来隔断的,但是在读取的时候,最后的一条记录会读到2次 不知道为什么,求解释

解决方案 »

  1.   

     print_r($data);看到是什么数据。只是一行? 输出两行?
      

  2.   

    格式有问题:|  和||
    如果用$data = explode("<|>",$buffer);
    分割的话,其实会把||分割掉的。
    建议把||换成其他的分隔符例如 :
      

  3.   

    print_r($data)得到的是Array ( [0] => gone||php||不错 [1] => Gone||PHP||输入留言信息 [2] => abc||def||adafdfa [3] => )输出的是:
    gone说: php,不错
    Gone说: PHP,输入留言信息
    abc说: def,adafdfa
    abc说: def,adafdfa
      

  4.   

    这样试试吧。是取了上次的变量的。 foreach ($data as $line){
                $username = "";
                if($line !="")
                {
                list($username,$title,$message)= explode("||",$line);
                }
                if($username!=""&&$title!=""&&$message!=""){
                    echo $username.'说:';
                    echo '&nbsp;'.$title.',';
                    echo $message."<br>";
                }    
            }
      

  5.   

    if($line !=""&&$username!=""&&$title!=""&&$message!=""){或这里更改下。做好判断。因为上次的变量没冲掉,还是会输出的。
      

  6.   

    或最好是写在上面那块里面。if($line !="")
    {....
    if($username!=""&&$title!=""&&$message!=""){
    echo '';
    }
    ...}
      

  7.   

    哈哈,看成是用 | 和||分割了,原来是 <|> 和||测试没有发现你说的最后一条记录读取两次的情况:
    txt中内容:
    gone||php||不错<|>Gone||PHP||输入留言信息<|>abc||def||adfe代码还是你的代码。
    结果为:
    gone说: php,不错
    Gone说: PHP,输入留言信息
    abc说: def,adfe
      

  8.   

    print_r($data)得到的是Array ( [0] => gone||php||不错 [1] => Gone||PHP||输入留言信息 [2] => abc||def||adafdfa [3] => )他有最后一条空数据。你测了么。照他这么写空数据会输出上次数据的。
      

  9.   

    知道问题所在了:
    文件中最后结束符为  <|>时会出现你说的情况。
    if($line !="")这个块执行最后一个空的记录时候,username会使用上次的结果。所以应该改为:        foreach ($data as $line){
                if($line !="")
                {
                list($username,$title,$message)= explode("||",$line);
                if($username!=""&&$title!=""&&$message!=""){
                    echo $username.'说:';
                    echo '&nbsp;'.$title.',';
                    echo $message."<br>";
                }    
            }
      }
      

  10.   

    回复9楼
    哦!我知道了
    好像是我分割<|>的时候出了点问题,我用
    gone||php||不错<|>Gone||PHP||输入留言信息<|>abc||def||adfe
    测试的时候也没问题,但是我写入的每条记录后都有<|>,所以我的TXT里是:
    gone||php||不错<|>Gone||PHP||输入留言信息<|>abc||def||adfe<|>
      

  11.   

    # ci1699  说的是对的,就是最后一条空记录没有执行if块中的代码,但是username等是使用的上次的结果。
      

  12.   


    把代码改成11楼写的那样,不管是不是<|>结尾都可以处理了。
      

  13.   

    回复8楼
    这么写的话,输出的是TXT里的原版数据