PHP中feof()函数实例测试


Posted in PHP onAugust 23, 2014

本文实例讲述了PHP中的feof()函数的用法,针对feof()函数进行了一定的测试,很有实用价值。具体分析如下:

本文实例运行环境:

OS:Mac OS X 10.8.4
PHP:5.3.15

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

测试代码如下:

<?php
print <<<EOF
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>测试PHP中的feof()函数效果</title>
  </head>
  <body>
    <div>
EOF;
function bool2str($bool) {
  if ($bool == TRUE) {
    return "TRUE";
  } else {
    return "FALSE";
  }
}
/*
 * 请随便创建一个文件。
 * 比如:本测试中,在脚本文件的相同路径下创建了一个文本文件,
 * 文件内容为“abcdefg”,文件名为“7bytesfile”。
 */
$filename = './7bytesfile';
$handle = fopen($filename, 'r');
if (!$handle) {
  die("文件打开失败");
}
for($i = 0; $i <= filesize($filename); $i++) {
  fseek($handle, $i);
  echo "文件位置" . ftell($handle) . ":<br />\n";
  echo "执行fseek,尚未执行读取操作之前,feof结果:" . bool2str(feof($handle)) . "<br />\n";
  echo "当前位置字符:" . fgetc($handle) . "<br />\n";
  echo "执行文件读取操作之后,feof结果:" . bool2str(feof($handle)) . "<hr />\n";
}
/*
 * 通过上面一段代码可以观察到,
 * 随着循环的执行,文件指针从文件头一直移动到文件末尾。
 * 但是当完成了字符“g”的读取输出,文件指针继续向后移动,这是feof()依然返回False。
 * 只有当执行了一次fgetc()操作之后,才返回true,表示到达文件末尾。
 */
echo "ftell()结果:". ftell($handle). "<hr />\n";
//输出一下,很郁闷的发现文件指针的位置还是7。+_+

fseek($handle, 4);
echo "文件位置" . ftell($handle) . ":<br />\n";
echo "执行fseek,尚未执行读取操作之前,feof结果:" . bool2str(feof($handle)) . "<br />\n";
echo "当前位置字符:" . fgetc($handle) . "<br />\n";
echo "执行文件读取操作之后,feof结果:" . bool2str(feof($handle)) . "<hr />\n";

fseek($handle, 7);
echo "文件位置" . ftell($handle) . ":<br />\n";
echo "执行fseek,尚未执行读取操作之前,feof结果:" . bool2str(feof($handle)) . "<br />\n";
echo "当前位置字符:" . fgetc($handle) . "<br />\n";
echo "执行文件读取操作之后,feof结果:" . bool2str(feof($handle)) . "<hr />\n";
fclose($handle);
//再次移动文件指针,效果依旧。
//再用另外一段代码测试一下:

$handle = fopen($filename, 'r');
if (!$handle) {
  die("文件打开失败");
}
while (!feof($handle)) {
  $char = fgetc($handle);
  if ($char === FALSE) {
    echo 'FALSE';
  } else {
    echo $char;
  }
}
fclose($handle);
//依然是输出了字符g之后,再次执行读取操作,才终止循环。

print <<<EOF
    </div>
  </body>
</html>
EOF;
?>

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

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

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

示例代码如下:

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

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

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

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

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

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

希望本文示例对大家PHP程序设计有所帮助。

PHP 相关文章推荐
自己前几天写的无限分类类
Feb 14 PHP
PHP的SQL注入实现(测试代码安全不错)
Feb 27 PHP
php设计模式 Mediator (中介者模式)
Jun 26 PHP
php生成略缩图代码
Jul 16 PHP
浅析php插件 HTMLPurifier HTML解析器
Jul 01 PHP
CodeIgniter使用phpcms模板引擎
Nov 12 PHP
两级联动select刷新后其值保持不变的实现方法
Jan 27 PHP
preg_match_all使用心得分享
Jan 31 PHP
PHP实现通过get方式识别用户发送邮件的方法
Jul 16 PHP
ThinkPHP连接Oracle数据库
Apr 22 PHP
PHP实现一个按钮点击上传多个图片操作示例
Jan 23 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
May 14 PHP
PHP实现利用MySQL保存session的方法
Aug 23 #PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
Aug 22 #PHP
ThinkPHP模板替换与系统常量及应用实例教程
Aug 22 #PHP
ThinkPHP调试模式与日志记录概述
Aug 22 #PHP
ThinkPHP连接数据库及主从数据库的设置教程
Aug 22 #PHP
ThinkPHP实例化模型的四种方法概述
Aug 22 #PHP
ThinkPHP中的create方法与自动令牌验证实例教程
Aug 22 #PHP
You might like
PHP+APACHE实现用户论证的方法
2006/10/09 PHP
PHP 数据库树的遍历方法
2009/02/06 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
laravel批量生成假数据的方法
2019/10/09 PHP
FLASH 广告之外的链接
2008/12/16 Javascript
jquery 通过name快速取值示例
2014/01/24 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
2019/01/21 Javascript
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
Python中特殊函数集锦
2015/07/27 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
2019/08/23 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
Python requests模块cookie实例解析
2020/04/14 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
解决pycharm修改代码后第一次运行不生效的问题
2021/02/06 Python
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
2014年五四青年节演讲比赛方案
2014/04/22 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
2021/08/23 HTML / CSS
Python如何用re模块实现简易tokenizer
2022/05/02 Python
Redis实战之Lettuce的使用技巧详解
2022/12/24 Redis