当使用fread函数时,如果设置的文件指针指向一个ascii码小于33(十进制)的字符,则无论读取多长都读不出来,即得到一个长度为0的字符串。譬如下面情况:
当设置文件指针为18或者22时,
fseek($file,18,SEEK_SET);
$buffer=fread($file,4);
这个得到的$buffer长度为0
有没有不同看法啊

解决方案 »

  1.   

    没有这种现象,你把测试文件多写点数据,如果短于18+4个字节数,strlen($buffer)肯定是0
      

  2.   

    我试验过了,一切正常,没有发现你所说的状况,源码如下
    <?PHP
    $filename = "./1.gif";
    $handle = fopen($filename, "rb+");
    fseek($handle,12,SEEK_SET);
    $buffer=fread($handle,4);
    var_dump($buffer);
      

  3.   

    不管我把
    fseek($handle,12,SEEK_SET);
    里的12修改成9,10,11,12 输出的结果都正确.
      

  4.   

    肯定是你哪里弄得不对了//模拟一个文件
    $s = "424d6c0600000000000036000000280000001c00000014000000010018000000";
    $fp = tmpfile();
    fwrite($fp, pack('H*', $s));//以十六进制查看
    fseek($fp, 0);
    $i = 0;
    while($i < 32) {
      printf('%02x ', ord(fgetc($fp)));
      if((++$i % 16) == 0) echo PHP_EOL;
    }
    /*
    42 4d 6c 06 00 00 00 00 00 00 36 00 00 00 28 00 
    00 00 1c 00 00 00 14 00 00 00 01 00 18 00 00 00 
    *///进入你的问题
    fseek($fp, 18);
    $t = fread($fp, 4);
    echo strlen($t), ' : ', bin2hex($t);
    /*
    4 : 1c000000
    */
      

  5.   

    我是直接在ide中看值的,ide中的情况是这样的,如图,这是我的文件:
                                         图1                                     图2                                     图3
    其中,$offset是偏移,$buffer是读到的四个字节,我将偏移量从1试到34,直到偏移量为30时,才出现图2的情况,之前的偏移量测试情况全为图3,这是IDE不对呢,还是我没有设置好。IDE是eclipse
      

  6.   

    我用了你的输出语句,好像也对了那就是Ide的问题吧