Как правильно записывать и считывать бинарные файлы на PHP? Ниже код, который выдает такую ошибку: Код (Text): Warning: unpack(): Type I: not enough input, need 4, have 1 Т.е. не срабатывает ф-я feof. Хотя достигнув конца файла она должна остановить цикл. Возможно, при записи бинарного файла нужно самому записывать и символ EOF? Код (Text): //id,login,email,phone $users = [ [1, 'user1', 'user1@mail.com', 786214569851], [2, 'user2', 'user2@mail.com', 786214569852], [3, 'user3', 'user3@mail.com', 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;
Код (PHP): //id,login,email,phone $users = [ [1, 'user1', 'user1@mail.com', 786214569851], [2, 'user2', 'user2@mail.com', 786214569852], [3, 'user3', 'user3@mail.com', 786214569853], ]; $countUser=sizeof($users); $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)) { if($countUser === sizeof($users)) { break; } $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); echo'<pre>'; print_r($users); die; Надеюсь причину уясните feof не сможет вызвать true.
Сделал другим способом, заменил: Код (Text): while(!feof($handle)) { ... на Код (Text): $size = filesize ('users.bin'); while(ftell($handle) < $size) { ... Работает отлично. Спасибо!
Только будьте внимательны, с большими и весомыми файлами! Ибо может возникнуть недоразумение! filesize такой ))