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 相关文章推荐
xml+php动态载入与分页
Oct 09 PHP
如何在PHP中使用Oracle数据库(1)
Oct 09 PHP
利用PHP实现与ASP Banner组件相似的类
Oct 09 PHP
表格展示无限级分类(PHP版)
Aug 21 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
Jun 27 PHP
php实现文件下载简单示例(代码实现文件下载)
Mar 10 PHP
php多任务程序实例解析
Jul 19 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
Jun 06 PHP
PHP设计模式之迭代器模式
Jun 17 PHP
关于PHP中协程和阻塞的一些理解与思考
Aug 11 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
Laravel5.1 框架表单验证操作实例详解
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
php预定义常量
2006/12/25 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
Javascript代码混淆综合解决方案-Javascript在线混淆器
2006/12/18 Javascript
点击下载链接 弹出页面实现代码
2009/10/01 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
Jquery实现的tab效果可以指定默认显示第几页
2013/10/16 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
js实现TAB切换对应不同颜色的代码
2015/08/31 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
微信小程序 Flex布局详解
2016/10/09 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
[03:56]显微镜下的DOTA2第十一期——鬼畜的死亡先知播音员
2014/06/23 DOTA
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
对于Python的Django框架部署的一些建议
2015/04/09 Python
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
python计算文本文件行数的方法
2015/07/06 Python
浅析python打包工具distutils、setuptools
2018/04/20 Python
Python3.8中使用f-strings调试
2019/05/22 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
python+rsync精确同步指定格式文件
2019/08/29 Python
Pytorch提取模型特征向量保存至csv的例子
2020/01/03 Python
详解Python中的分支和循环结构
2020/02/11 Python
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
美术专业学生个人自我评价
2013/09/19 职场文书
黄金酒广告词
2014/03/21 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
金融管理专业求职信
2014/07/10 职场文书
中国梦演讲稿开场白
2014/08/28 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书