PHP中fgets()函数返回异常结果的问题求助
PHP fgets循环输出异常排查
相关代码
#!/usr/bin/php <?php define("KPA_PEOPLE","/devel/pic/snk_db2/KPA-migration/Keywords/gettingTheKeywordsAndFiles/KPA_People.txt"); $hndl_kpa_people=fopen(KPA_PEOPLE,"r+") or die("Failed opening ".KPA_PEOPLE); while($line=fgets($hndl_kpa_people)!==FALSE){ echo "\nline: ".$line."\n"; } ?>
上下文信息
- 文件权限及所属:
-rw-r--r-- 1 snkdb snkdb 6096 dec 25 14:08 KPA_People.txt(当前运行用户为snkdb) - 文件内容示例:
et|2 Elisabet|3 okända|4...
实际运行结果
line: 1 line: 1 line: 1...
预期结果
line: et|2 line: Elisabet|3 line: okända|4...
问题描述
我认为while($line=fgets($hndl_kpa_people)!==FALSE)的写法符合官方手册规范,且之前在其他脚本中能正常运行,但此次执行后输出全是1,和预期不符,求排查思路。
解决思路
问题核心是运算符优先级:!==的优先级高于=,原代码会先执行fgets($hndl_kpa_people) !== FALSE得到布尔值,再把这个布尔值赋值给$line。因为文件有可读内容,每次判断结果都是true,布尔值true输出时会被转为字符串1,所以出现了重复输出1的情况。
修正方法是给赋值表达式加括号,确保先完成赋值再做判断:
while( ($line = fgets($hndl_kpa_people)) !== FALSE ){ echo "\nline: ".$line."\n"; }
另外,此场景仅需读取文件,用r模式替代r+更稳妥,可避免误修改文件内容。
内容的提问来源于stack exchange,提问作者Per Funke
相关产品推荐
相关产品推荐

