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 相关文章推荐
新版PHP将向Java靠拢
Oct 09 PHP
PHP全概率运算函数(优化版) Webgame开发必备
Jul 04 PHP
php header功能的使用
Oct 28 PHP
ThinkPHP页面跳转success与error方法概述
Jun 25 PHP
php从csv文件读取数据并输出到网页的方法
Mar 14 PHP
thinkPHP分组后模板无法加载问题解决方法
Jul 12 PHP
PHP简单判断手机设备的方法
Aug 23 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
Apr 03 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
May 06 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
Aug 14 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
Jan 07 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
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
php中DOMElement操作xml文档实例演示
2013/03/26 PHP
php获取网页中图片、DIV内容的简单方法
2014/06/19 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
深入分析PHP优化及注意事项
2016/07/04 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
一个符号插入器 中用到的js代码
2007/09/04 Javascript
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
2014/04/08 Javascript
一个非常全面的javascript URL解析函数和分段URL解析方法
2014/04/12 Javascript
jQuery中:has选择器用法实例
2014/12/30 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
JS获取Table中td值的方法
2015/03/19 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
详解AngularJS 过滤器的使用
2018/06/02 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
详解离线安装npm包的几种方法
2018/11/25 Javascript
JS实现星星海特效
2019/12/24 Javascript
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
[03:43]TI9战队采访——PSG.LGD
2019/08/22 DOTA
python监控网卡流量并使用graphite绘图的示例
2014/04/27 Python
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
python脚本后台执行方式
2019/12/21 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
会计电算化毕业生自荐信
2014/03/03 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
团代会邀请函
2015/02/02 职场文书
《有余数的除法》教学反思
2016/02/22 职场文书