Запись бинарных файлов

at0m1x

Новичок
Как правильно записывать и считывать бинарные файлы на PHP?
Ниже код, который выдает такую ошибку:

Код:
Warning: unpack(): Type I: not enough input, need 4, have 1
Т.е. не срабатывает ф-я feof. Хотя достигнув конца файла она должна остановить цикл. Возможно, при записи бинарного файла нужно самому записывать и символ EOF?

Код:
//id,login,email,phone
$users = [
[1, 'user1', '[email protected]', 786214569851],
[2, 'user2', '[email protected]', 786214569852],
[3, 'user3', '[email protected]', 786214569853],
];

$bin = '';
foreach ($users as $values) {
list($id, $login, $email, $phone) = $values;
$loginLength = strlen($login);
$emailLength = strlen($email);

$bin .= pack("I2a{$loginLength}Ia{$emailLength}I", $id, $loginLength, $login, $emailLength, $email, $phone);
}

$handle = fopen('users.bin', 'wb');
fwrite($handle, $bin);
fclose($handle);

//---------------------

$users = [];
$handle = fopen('users.bin', 'rb');
while(!feof($handle)) {
$data = fread($handle, 4);
$data = unpack('Iid', $data);
$result['id'] = $data['id'];

$data = fread($handle, 4);
$data = unpack('Ilength', $data);
$loginLength = $data['length'];

$data = fread($handle, $loginLength);
$data = unpack('a*login', $data);
$result['login'] = $data['login'];

$data = fread($handle, 4);
$data = unpack('Ilength', $data);
$emailLength = $data['length'];

$data = fread($handle, $emailLength);
$data = unpack('a*email', $data);
$result['email'] = $data['email'];

$data = fread($handle, 4);
$data = unpack('Iphone', $data);
$result['phone'] = $phone;

$users[] = $result;
}
fclose($handle);

print_r($users);
die;
 

at0m1x

Новичок
Чувак, ты не видишь никаких проблем в этом умозаключении, да?
Понятно что unpack() вместо 4 байт получает только 1, поэтому возникает эта ошибка. Можно сденлать проверку на кол-во сичтанных байт и выходить из цикла если их меньше 4. Но ведь feof должна работать.
 

at0m1x

Новичок
Сделал другим способом, заменил:

Код:
while(!feof($handle)) {
...

на

Код:
$size = filesize ('users.bin');
while(ftell($handle) < $size) {
...
Работает отлично. Спасибо!
 

hell0w0rd

Продвинутый новичок
А зачем на php делать чтение/запись бинарных файлов?
 

AnrDaemon

Продвинутый новичок
А зачем на php делать чтение/запись бинарных файлов?
Странный вопрос... что именно вас настораживает в сём действии?

P.S.
Не стоит использовать модификатор I - ты не можешь быть уверен в результате его работы.
 
Сверху