Fseek добавляет NUL = \ u0 символов в выходной файл

Я создаю простое PHP-приложение, в котором происходит загрузка файла csv, а затем загрузка файла .stm (это простой текстовый файл). Записи должны быть записаны в заданной байтовой позиции. Например: 1-я позиция записи 1, длина 2, 2-я запись и т. Д.документация

Поэтому я пытаюсь использовать fwrite, fseek, чтобы добраться до заданной позиции, например, мне не нужно заполнять 2 записи, поэтому я перехожу на позицию 11, но в файле есть NUL-символы.

Код:

$input = $sFileName;
//a nevbol kiszedni a datumot, majd EEEEHHNN verziora konvertalni
$get_date_from_name = str_replace(".","",substr($sFileName,0,10));
$output = $get_date_from_name . '_mpl_tensoft_import.stm';

$_SESSION['file_name'] = $output;

if (false !== ($ih = fopen($input, 'r'))) {

$oh = fopen($output, 'w+b');

//Create first line of the file 11 record type
fwrite($oh,"11");
fseek($oh, 11);
fwrite($oh,"120967120159857100100007");

/*while (false !== ($data = fgetcsv($ih,0,";"))) {
// this is where you build your new row
//Interne cislo, Dodavatel, Dodavacie c.faktury Celk.suma, Dátum prijatia, Dátum splat. = Datum uhrady, Predmet
$outputData = array($data[0], $data[1], $data[2], $data[3], $data[12], $data[13],  $data[36] );
fputcsv($oh, $outputData);
}*/

fclose($ih);
fclose($oh);

unlink($input);
}

Результат:

11NULNULNULNULNULNULNULNULNUL120967120159857100100007

Код Visual Studio выдает ошибку, что файл является двоичным или большим или использует неподдерживаемую кодировку.

Notepad ++ добавляет символы NUL.

Должен ли я просто использовать символ пробела? 1 пробельный символ равен 1 байту? Файл должен быть в кодировке CP852

Спасибо за помощь и указание в правильном направлении.

0

Решение

Ваш seek() смещение кажется «вне диапазона».

Документация сказал :

В общем, разрешено искать за концом файла; если данные затем записываются, читает в любой неписанной области между концом файла и искомой позицией даст байтов со значением 0.

РЕДАКТИРОВАТЬ :

Если вы хотите поместить второе число со смещением 13, используя пробелы, вы можете сделать что-то вроде этого:

$ban_pos = 13 ;
$num = "11" ;
$pos = $ban_pos - strlen($num) ;
$ban = "120967120159857100100007" ;

$oh = fopen($output, 'w+');
fwrite($oh, $num);
fwrite($oh, str_repeat(' ', $pos));
fwrite($oh, $ban);
fclose($oh);

Файл будет содержать:

11 120967120159857100100007

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]