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 相关文章推荐
Godaddy空间Zend Optimizer升级方法
May 10 PHP
php邮件发送,php发送邮件的类
Mar 24 PHP
php使用pack处理二进制文件的方法
Jul 03 PHP
php多次include后导致全局变量global失效的解决方法
Feb 28 PHP
php修改文件上传限制方法汇总
Apr 07 PHP
PHP.vs.JAVA
Apr 29 PHP
PHP上传图片类显示缩略图功能
Jun 30 PHP
Laravel5权限管理方法详解
Jul 26 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
Jun 09 PHP
PHP中error_reporting函数用法详细介绍
Jun 11 PHP
PHP设计模式之单例模式定义与用法分析
Mar 26 PHP
laravel5环境隐藏index.php后缀(apache)的方法
Oct 12 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
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
CodeIgniter控制器之业务逻辑实例分析
2016/01/20 PHP
微信公众号开发之文本消息自动回复php代码
2016/08/08 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
Javascript &amp; DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
比较全面的event对像在IE与FF中的区别 推荐
2009/09/21 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
js图片向右一张张滚动效果实例代码
2013/11/23 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
基于BootstrapValidator的Form表单验证(24)
2016/12/12 Javascript
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
深入理解Django-Signals信号量
2019/02/19 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
Python根据字典的值查询出对应的键的方法
2020/09/30 Python
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
喝酒检查书范文
2014/02/23 职场文书
消防演习感想
2015/08/10 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang