fwrite php win непонятное поведение

97
12 сентября 2021, 06:50

При некоррекном завершении работы пк в файле появляются NULL символы (chr(0)), попытаемся их убрать:

$file = 'e:/1.txt';
file_put_contents($file, 'hello'.chr(1).'0df6ac'.chr(0));
$fp = fopen($file, 'r+b');
$str = fread($fp, filesize($file));
$str = strtr($str, [chr(0)=>'']);
echo $str.PHP_EOL;//hello0df6ac
fseek($fp, 0);//указатель в начало
fwrite($fp, $str);
fclose($fp);

Ничего не меняется, опытным путём выяснил:
1. fopen считывает все символы 2. fwrite как бы "оставляет" старые символы (если к записываемой строке добавить символ это видно)

file_put_contents работает правильно, но т.к. мне нужно открывать файл на чтение с блокировкой, эта функция не подходит

Answer 1
$str = strtr($str, [chr(0)=>'']);

Вы заменяете нулевой байт на пустую строку. То есть нулевой байт вы вырезаете и новая строка становится короче. И здесь как раз критично важно то что новая строка стала меньше.

Вы делаете fseek в начало и пишете новую строку. fwrite пишет указанные данные в место файла по текущему смещению. Вы решили, что fwrite должен отбросить остальную часть файла? Нет, fwrite это делать не должен. Это простое действие записать N байт данных. Вы попросили записать по смещению 0 в файл размером 13 байт новые данные размером 12 байт. Эти 12 байт и были перезаписаны. Тринадцатый байт как был так и остался нетронутым, с ним ничего делать не просили.

Вам необходимо вызвать ftruncate где-то. Например, после fseek отбросить содержимое файла до 0:

fseek($fp, 0);
ftruncate($fp, 0);

Либо после записи данных но тогда уже с ненулевым значением size.

READ ALSO
Удалить ссылку внутри изображения

Удалить ссылку внутри изображения

Все привет! Я получаю ссылку на изображение, внизу которого находится ссылка, причем это не элемент html, а оригинальное изображениеВозможно...

87
При запуске локального приложения в Битрикс24 нет результата, только код

При запуске локального приложения в Битрикс24 нет результата, только код

создаю тестовый пустой Битрикс24также создаю локальное приложение и устанавливаю в него следующий файл:

97
PhpStorm не открывает файлы через xdebug.file_link_format

PhpStorm не открывает файлы через xdebug.file_link_format

PhpStorm не открывает файлы через xdebugfile_link_format Уже перепробовал разные форматы, и все равно не открывает

107