zoukankan      html  css  js  c++  java
  • PHP中feof()函数的猜测

    本文环境:
    OS:Mac OS X 10.8.4
    PHP:5.3.15

      PHP的官方手册中,函数feof()下面的讨论不少,对此做了一些相关的测试。

     1 <?php
     2 print <<<EOF
     3 <!DOCTYPE html>
     4 <html>
     5     <head>
     6         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     7         <title>测试PHP中的feof()函数效果</title>
     8     </head>
     9     <body>
    10         <div>
    11 EOF;
    12 
    13 function bool2str($bool) {
    14     if ($bool == TRUE) {
    15         return "TRUE";
    16     } else {
    17         return "FALSE";
    18     }
    19 }
    20 
    21 /*
    22  * 请随便创建一个文件。
    23  * 比如:本测试中,在脚本文件的相同路径下创建了一个文本文件,
    24  * 文件内容为“abcdefg”,文件名为“7bytesfile”。
    25  */
    26 $filename = './7bytesfile';
    27 $handle = fopen($filename, 'r');
    28 if (!$handle) {
    29     die("文件打开失败");
    30 }
    31 
    32 for($i = 0; $i <= filesize($filename); $i++) {
    33     fseek($handle, $i);
    34     echo "文件位置" . ftell($handle) . ":<br />\n";
    35     echo "执行fseek,尚未执行读取操作之前,feof结果:" . bool2str(feof($handle)) . "<br />\n";
    36     echo "当前位置字符:" . fgetc($handle) . "<br />\n";
    37     echo "执行文件读取操作之后,feof结果:" . bool2str(feof($handle)) . "<hr />\n";
    38 }
    39 /*
    40  * 通过上面一段代码可以观察到,
    41  * 随着循环的执行,文件指针从文件头一直移动到文件末尾。
    42  * 但是当完成了字符“g”的读取输出,文件指针继续向后移动,这是feof()依然返回False。
    43  * 只有当执行了一次fgetc()操作之后,才返回true,表示到达文件末尾。
    44  */
    45 
    46 echo "ftell()结果:". ftell($handle). "<hr />\n";
    47 //输出一下,很郁闷的发现文件指针的位置还是7。+_+
    48 
    49 fseek($handle, 4);
    50 echo "文件位置" . ftell($handle) . ":<br />\n";
    51 echo "执行fseek,尚未执行读取操作之前,feof结果:" . bool2str(feof($handle)) . "<br />\n";
    52 echo "当前位置字符:" . fgetc($handle) . "<br />\n";
    53 echo "执行文件读取操作之后,feof结果:" . bool2str(feof($handle)) . "<hr />\n";
    54 
    55 fseek($handle, 7);
    56 echo "文件位置" . ftell($handle) . ":<br />\n";
    57 echo "执行fseek,尚未执行读取操作之前,feof结果:" . bool2str(feof($handle)) . "<br />\n";
    58 echo "当前位置字符:" . fgetc($handle) . "<br />\n";
    59 echo "执行文件读取操作之后,feof结果:" . bool2str(feof($handle)) . "<hr />\n";
    60 fclose($handle);
    61 //再次移动文件指针,效果依旧。
    62 //再用另外一段代码测试一下:
    63 
    64 $handle = fopen($filename, 'r');
    65 if (!$handle) {
    66     die("文件打开失败");
    67 }
    68 while (!feof($handle)) {
    69     $char = fgetc($handle);
    70     if ($char === FALSE) {
    71         echo 'FALSE';
    72     } else {
    73         echo $char;
    74     }
    75 }
    76 fclose($handle);
    77 //依然是输出了字符g之后,再次执行读取操作,才终止循环。
    78 
    79 print <<<EOF
    80         </div>
    81     </body>
    82 </html>
    83 EOF;
    84 ?>

      针对这种情况的猜测是,在PHP中,feof()的实现方式并非直接检查文件指针相对于文件的位置,而是根据某个标识返回结果。每次fseek()之后都会都会把这个标识设置为“False”,只有当执行一次文件内容读取操作之后,才会根据文件读取的结果对标识进行设置。

      根据这种猜测,可以使用两种代码逻辑。

      一个方法是不做feof()检测,直接检测内容读取函数(比如fgetc()、fgets())的执行结果。

    1 while (($content = fgets($fileHandle)) !==FALSE) {
    2     //文件内容处理……  
    3 }

      这种处理办法,利用了PHP被诟病的函数返回方式,所以得用“===”或“!==”进行检测,不能把代码简化成:

    while ($content = fgets($fileHandle)) {}

      另外一个方法是先进行一次文件读取,然后再进入feof()循环:

    1 $content = fgets($fileHandle);
    2 while (!feof($fileHandle)) {
    3     //处理文件内容……
    4     $content = fgets($fileHandle);  
    5 }

      经过测试,似乎前一种方法效率会高一些。

  • 相关阅读:
    Linux 学习 step by step (1)
    ubuntu server nginx 安装与配置
    ubuntu server samba服务器配置
    iOS app集成支付宝支付流程及后台php订单签名处理
    mac 连接windows 共享内容
    linux 文件查找,which,whereis,locate,find
    ubuntu server vsftpd 虚拟用户及目录
    ubuntu server 安装 mantis bug tracker 中文配置
    ubuntu server vsftpd 匿名用户上传下载及目录设置
    linux 用户管理,用户权限管理,用户组管理
  • 原文地址:https://www.cnblogs.com/cndavidwang/p/3316027.html
Copyright © 2011-2022 走看看