2017-01-26 9 views
0

У меня есть куча файлов с данными отформатированных следующим образом: INT | INT | Строка | строкаPHP sscanf не печатает первую строку в файле, но следующие строки

У меня есть некоторые функции, чтобы получить все файлы каталог, отформатируйте их имена и сделайте из него раскрывающееся меню.

Из этого пользователя выбирается файл, который он хочет открыть.

Выбранный файл (его имя) отправляется через 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 теги имеют второй строка данных в них, как и должно быть, поэтому почему она не читает, не сканирует и не печатает первую строку файла?

ответ

1

Я считаю, что это происходит потому, что в начале ваших файлов есть «Знак порядка байтов». Вам необходимо его проверить и заменить или удалить из файлов.

Вот что работает для меня:

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); 

Надеется, что это помогает.

+0

Да, это было причиной моей проблемы. Большое спасибо. Просто преобразовали файлы из UTF8-BOM в UTF8. –