PHP: feof miss 最后一句话

PHP: feof miss last word

提问人:user3649959 提问时间:11/13/2015 更新时间:11/13/2015 访问量:210

问:

这个问题很简单,但同时也很复杂。 Feof 没有打印我的最后一句话。它取自文件名 city 和 code (Venice,A908),并应显示在 OUTPUT: nameCity,codeOfCity 中。 让我举个例子:

City.csv

Abano Terme,A001
Abbadia Cerreto,A004
Abbadia Lariana,A005
Abbiategrasso,A010
Zubiena,M196
Zuccarello,M197
Zuclo,M198
Zungri,M204

法典:

<?php
$buffer = "";
$file = fopen("City.csv", "r");

//while (($c = fgetc($file)) != EOF )
//while (($c = fgetc($file)) != NULL )
//while (($c = fgetc($file)) !== false )
while(!feof($file)) 
{       
    $c = fgetc($file);
    $buffer .= $c;

    if($c == ",")
    {
        echo $buffer;       
        $buffer = "";
    }

    if($c == "\n")
    {           
        echo $buffer."<br/>";

        $buffer = "";
    }           
}

fclose($file);
?>

输出:

Abano Terme,A001 
Abbadia Cerreto,A004 
Abbadia Lariana,A005 
Abbiategrasso,A010 
Zubiena,M196 
Zuccarello,M197 
Zuclo,M198 
Zungri,
PHP EOF FEOF

评论

2赞 iam-decoder 11/13/2015
您正在解析 CSV 文件,为什么不使用 ?fgetcsv()
0赞 frz3993 11/13/2015
因为最后一行没有,因此不满足任何 if 条件。"\n"
0赞 user3649959 11/13/2015
因为我想得到名字和城市,并且 getc 允许这个!
0赞 frz3993 11/13/2015
为什么不使用 fgets 并逐行打印。
0赞 user3649959 11/13/2015
因为我需要在不同的变量中获取 nameCity 和 Code!我只是尝试了您提交的所有方法!!谢谢:D

答:

1赞 Mike Brant 11/13/2015 #1

既然您似乎只是尝试按原样输出文件,唯一的变化是替换 HTML 换行符而不是换行符,为什么不简化一下呢?<br />

echo nl2br(file_get_contents('City.csv'), true);

或者,如果您不想将整个文件读入内存:

$file = fopen('City.csv', 'r');
while(!feof($file)) {       
    echo nl2br(fgets($file), true);
}
fclose($file);

在上面的一条评论中,您提到您希望将 city 和 city 值作为变量提供(尽管您的代码示例似乎没有指示这一点)。如果是这种情况,请尝试这样做:fgetcsv()

$file = fopen('City.csv', 'r');
while($values = fgetcsv($file)) {
    $city = $values[0];
    $city_code = $values[1];
    echo $city . ',' . $city_code . '<br />';
}
fclose($file);

评论

0赞 AbraCadaver 11/13/2015
@user3649959:查一下!
0赞 Mike Brant 11/13/2015
它是PHP的新行到BR标签的转换功能。php.net/manual/en/function.nl2br.php
0赞 Mike Brant 11/13/2015
@user3649959,如果您发现自己想要实际读取 CSV 并将城市和城市代码的值作为变量,那么您应该查看fgetcsv()
0赞 user3649959 11/13/2015
我正在尝试,但不明白如何从数组:D获取价值
0赞 user3649959 11/13/2015
我试过了,但它做了一个循环!编辑:对不起,我的错,好吧,它:D谢谢
0赞 iam-decoder 11/13/2015 #2

您的问题是,文件末尾没有换行符,因此它永远不会达到输出缓冲区内容的最后一个检查。"\n"

要解决此问题,您只需要在该条件上再进行一次检查即可。改变

if($c == "\n")

自:

if($c == "\n" || feof($file))

如果您想使用正确的函数来解析 csv 文件,下面是一个更简洁、更简洁的代码版本:

<?php
$buffer = array();
$file = fopen("City.csv", "r");
while(!feof($file) && $buffer[] = fgetcsv($file));
fclose($file);
foreach($buffer as $line){
    echo join(',', $line).'<br/>';
}
?>