Я создаю простое 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
Спасибо за помощь и указание в правильном направлении.
Ваш 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
Других решений пока нет …