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应用技巧
Mar 27 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
Nov 01 PHP
simplehtmldom Doc api帮助文档
Mar 26 PHP
利用PHP扩展vld查看PHP opcode操作步骤
Mar 04 PHP
php批量更改数据库表前缀实现方法
Oct 26 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
Aug 19 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
Nov 19 PHP
YII2.0之Activeform表单组件用法实例
Jan 09 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
PHP验证终端类型是否为手机的简单实例
Feb 07 PHP
PHP基于SimpleXML生成和解析xml的方法示例
Jul 17 PHP
php微信公众号开发之答题连闯三关
Oct 20 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的password_hash()使用实例
2014/03/17 PHP
帝国cms目录结构分享
2015/07/06 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
2017/08/15 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
来自qq的javascript面试题
2010/07/24 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
jquery 实现两Select 标签项互调示例代码
2014/09/25 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
浅谈js中用$(#ID)来作为选择器的问题(id重复的时候)
2017/02/14 Javascript
微信小程序 下拉菜单的实现
2017/04/06 Javascript
详解Vue中过度动画效果应用
2017/05/25 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
Linux下编译安装MySQL-Python教程
2015/02/02 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
PyCharm配置mongo插件的方法
2018/11/30 Python
Python中捕获键盘的方式详解
2019/03/28 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
2020/04/20 Python
一文解决django 2.2与mysql兼容性问题
2020/07/15 Python
乡镇干部十八大感言
2014/02/17 职场文书
技术负责人岗位职责
2015/02/10 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python