【问题标题】:PHP sscanf doesn't print first line in file but the following linesPHP sscanf 不打印文件中的第一行,而是打印以下行
【发布时间】:2017-01-26 10:37:02
【问题描述】:

我有一堆数据格式如下的文件: 整数|整数|字符串|字符串

我有一些函数可以获取目录中的所有文件,格式化它们的名称并从中创建一个选择下拉菜单。

用户从中选择他要打开的文件。

选择的文件(其文件名)通过 POST 发送到第二个 php 文件,该文件在下拉表单正下方的 iframe 中打开。

这些是该文件的相关内容:

<table>
    <thead>
        <tr>
            <th>A:</th>
            <th>B:</th>
            <th>C:</th>
        </tr>
    </thead>
    <tbody>
<?php
$fl = $_POST["file"];
$currentfile = fopen("./dir/$fl","r");
if ($currentfile) {
    while (($line = fgets($currentfile)) !== false) {
        $n = sscanf($line, "%d|%d|%[^|]|%[^\n]", $a,$b,$c,$d);
        print "<tr><td>$a</td><td>$b</td><td>$d</td></tr>";
    }
    fclose($currentfile);
    } else {
        print "Error: Couldn't open file.<br>";
    }
?>
    </tbody>
</table>

现在不知何故,每个文件的第一行没有显示在由此生成的表中,其他一切都很好。

例如,这里有一个文件。

1|334|Item 1
2|837|Item 2
3|321|Item 3
4|124|Item 4
5|331|Item 5

etc...

这是我得到的输出。

A:   B:   C:

2    837  Item 2
3    321  Item 3
4    124  Item 4
5    331  Item 5

etc...

或者在代码中:

<table>
    <thead>
        <tr>
            <th>A:</th>
            <th>B:</th>
            <th>C:</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td>2</td>
            <td>837</td>
            <td>Item 2</td>
        </tr>
        <tr>
            <td>3</td>
            <td>321</td>
            <td>Item 3</td>
        </tr>
        <tr>
            <td>4</td>
            <td>124</td>
            <td>Item 4</td>
        </tr>
        <tr>
            <td>5</td>
            <td>331</td>
            <td>Item 5</td>
        </tr>

        etc...

    </tbody>
</table>

从上面的代码可以看出,打印了 td 标签,但是里面没有数据,而第二组 td 标签里面有第二行数据,应该是这样,那为什么不呢?它读取、扫描并打印文件的第一行?

【问题讨论】:

    标签: php file-io printing fgets scanf


    【解决方案1】:

    我相信这是因为文件开头有“Byte order mark”。 您需要检查并替换它或从文件中删除它。

    这对我有用:

    while (($line = fgets($currentfile)) !== false) {
        $bom = pack('H*','EFBBBF');
        $line = preg_replace("/^$bom/", '', $line);
    
        $n = sscanf($line, "%d|%d|%[^|]|%[^\n]", $a, $b, $c, $d);
        print "<tr><td>$a</td><td>$b</td><td>$c</td></tr>";
    }
    

    也许此代码在您的系统上不起作用,您需要尝试一些其他代码来删除 BOM。 也试试这个:

    $line = str_replace("\xEF\xBB\xBF",'',$line);
    

    希望对你有帮助。

    参考

    【讨论】:

    • 是的,这就是我的问题的原因。非常感谢你。刚刚将文件从 UTF8-BOM 转换为 UTF8。
    猜你喜欢
    • 2013-02-25
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多