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 相关文章推荐
完美解决dedecms中的[html][/html]和[code][/code]问题
Mar 20 PHP
PHP 危险函数解释 分析
Apr 22 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
Jun 19 PHP
php mysql_real_escape_string函数用法与实例教程
Sep 30 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
Oct 23 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
Jan 30 PHP
php单例模式示例分享
Feb 12 PHP
DEDECMS首页调用图片集里的多张图片
Jun 05 PHP
php中get_magic_quotes_gpc()函数说明
Feb 06 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
Feb 28 PHP
php使用curl模拟多线程实现批处理功能示例
Jul 25 PHP
Laravel框架实现抢红包功能示例
Oct 31 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
关于时间计算的结总
2006/12/06 PHP
php设计模式 Facade(外观模式)
2011/06/26 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
2014/03/14 PHP
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
影响jQuery使用的14个方面
2014/09/01 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
详解VS Code使用之Vue工程配置format代码格式化
2019/03/20 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
Python中 Lambda表达式全面解析
2016/11/28 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
UNIX文件名称有什么规定
2013/03/25 面试题
服务员岗位责任制
2014/02/11 职场文书
班风学风建设方案
2014/05/06 职场文书
小学运动会开幕词
2015/01/28 职场文书
六一儿童节致辞
2015/07/31 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书