php函数fgets()意外结果

k5ifujac  于 2022-12-25  发布在  PHP
关注(0)|答案(2)|浏览(133)
#!/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";
}
?>
Context: 
The file looks like this in the file system:
-rw-r--r-- 1 snkdb snkdb   6096 dec 25 14:08 KPA_People.txt
(I'm the user snkdb)

The file's contents looks like:
et|2
Elisabet|3
okända|4...

结果如下所示:

line: 1

line: 1

line: 1...

预期结果是:

et|2

Elisabet|3

okända|4...

据我所知,while($line=fgets($hndl_kpa_people)!==FALSE)遵循了手册中的约定,看起来像是在早期的脚本中工作的。2任何想法都将不胜感激!

jtoj6r0c

jtoj6r0c1#

在以下行中:

while($line=fgets($hndl_kpa_people)!==FALSE)

PHP首先计算表达式fgets($hndl_kpa_people)!==FALSE,然后将其赋给变量$line
此外,如果while循环中的某些内容与false不同,则进行评估是多余的,因为while循环在其评估的条件为真时运行。
因此,该行应为:

while($line = fgets($hndl_kpa_people))

您可以在官方文档中阅读更多关于运算符优先级的信息:https://www.php.net/manual/en/language.operators.precedence.php
您可以在这里阅读更多关于while loop的信息:https://www.php.net/manual/en/control-structures.while.php

**编辑:**因为注解中有一个混淆,阅读一个空行是否会返回false-它不会,举下面这个简单的例子:

<?php

$file = fopen('sample.txt', "r+");
$counter = 0;
while ($line = fgets($file)) {
    print_r("Counter: $counter - Line: " . $line);
    $counter++;
}
fclose($file);

使用以下示例文件:

test 123

test 234
test 345

执行的结果为:

Counter: 0 - Line: test 123
Counter: 1 - Line: 
Counter: 2 - Line: test 234
Counter: 3 - Line: test 345
quhf5bfb

quhf5bfb2#

谢谢你们!两个答案都很好。尼古拉得到了问题,奈杰尔提出了有效的解决方案。我希望你们也有一些空闲时间,在假期。

相关问题