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 相关文章推荐
Google Voice 短信发送接口PHP开源版(2010.5更新)
Jul 22 PHP
apache mysql php 源码编译使用方法
May 03 PHP
解析php5配置使用pdo
Jul 03 PHP
浅谈php安全性需要注意的几点事项
Jul 17 PHP
PHP @ at 记号的作用示例介绍
Oct 10 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
Mar 13 PHP
Symfony2中被遗弃的getRequest()方法分析
Mar 17 PHP
Smarty变量用法详解
May 11 PHP
Yii视图CGridView实现操作按钮定义地址示例
Jul 14 PHP
php 从一个数组中随机的取出若干个不同的数实例
Dec 31 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
PHP生成推广海报的方法分享
Apr 22 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
2020年4月放送!《Princess Connect Re:Dive》制作组 & 角色声优公开!
2020/03/06 日漫
PHP中的命名空间详细介绍
2015/07/02 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)
2016/11/30 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
vue mvvm数据响应实现
2020/11/11 Javascript
Python文件夹与文件的操作实现代码
2014/07/13 Python
用Python写冒泡排序代码
2016/04/12 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
2018/01/05 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
使用python存储网页上的图片实例
2018/05/22 Python
如何实现Django Rest framework版本控制
2019/07/25 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
pyspark 随机森林的实现
2020/04/24 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
如何用python免费看美剧
2020/08/11 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
女大学生个人求职信
2013/12/09 职场文书
活动总结报告范文
2014/05/04 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
未中标通知书
2015/04/17 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
导游词之襄阳古城
2019/09/27 职场文书
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python