[php] otwieranie pliku NIE txt

Odpowiedz Nowy wątek
CPS
2006-10-20 19:07
CPS
0

witam

chciałem się dowiedzieć czy można (i jak) otworzyć i odczytać dane w PHP z pliku, który został zapisany w PASCALU poprzez rekordy, czyli:

type
 TRekord = packed record
   czas: integer;
   id: shortint;
   x,y: shortint;
 end;
 TRekordFile = file of TRekord;

var 
  Rekord = TRekord;
begin

  assign(outfile, 'date/1.dat');
  rewrite(outfile);

          Rekord.czas:=czas;
          Rekord.id:=klub[k].pilkarze[i].id;
          Rekord.x:=klub[k].pilkarze[i].x;
          Rekord.y:=klub[k].pilkarze[i].y;

          Write(outfile, Rekord);

  close(outfile);
end.

oczywiście plik nie jest czytelny poprzez normalne otwarcie:(

Pozostało 580 znaków

nav
2006-10-20 19:21
nav

Rejestracja: 16 lat temu

Ostatnio: 1 miesiąc temu

Lokalizacja: Warszawa

0

Zamiana znaków na liczby i tyle.
Czytasz 4 znaki, zamieniasz na liczbę - masz czas. (nie konwersja. 2563ciag[0]+2562ciag[1]+256*ciag[2]+ciag[3])
Potem kolejne znaki aż odczytasz cały rekord.
Potem kojeny rekord, i kolejny itd.


utf-8 rlz! ٩(ಥ_ಥ)۶

Pozostało 580 znaków

ŁF
2006-10-20 19:53
ŁF
Moderator

Rejestracja: 17 lat temu

Ostatnio: 9 godzin temu

0

http://pl2.php.net/manual/pl/function.fread.php


Pozostało 580 znaków

2006-10-21 17:44

Rejestracja: 18 lat temu

Ostatnio: 2 tygodnie temu

0

a mnie zaciekawilo, jak najprosciej z bajtow zrobic liczbe i napisalem taki przyklad (tylko z tym najprosciej to chyba mi sie nie udalo), zakladam ze shortint jest jednobajtowym oznaczonym integerem:

<?php

  function bytes2int($str, $signed = false) {
    for ($i = 0; $i < strlen($str); $i++) 
      $ret[] = str_pad(dechex(ord($str[$i])), 2, '0', 0);
    $ret = hexdec(join('', array_reverse($ret)));
    if ($signed && (ord($str[strlen($str) - 1]) & 128))
      $ret -= pow(256, strlen($str)); 
    return $ret;
  }

  function read_TRekord($fp) {
    $ret = array();
    $ret['czas'] = bytes2int(fread($fp, 4), true);
    $ret['id'] = bytes2int(fread($fp, 1), true);
    $ret['x'] = bytes2int(fread($fp, 1), true);
    $ret['y'] = bytes2int(fread($fp, 1), true);
    return $ret;
  }

  $rec = array();
  if ($fp = fopen('date/1.dat', 'rb')) {
    $rec = read_TRekord($fp);
    fclose($fp);
  }
  print_r($rec);

?>

Pozostało 580 znaków

2006-10-21 21:53

Rejestracja: 16 lat temu

Ostatnio: 8 lat temu

0

jest taka funkcja jak unpack

// dzizas, wiedzialem ze tak bedzie, wszystko juz napisali :( - m.piechnat

dla przypadku powyżej to by było:

<?php

$plik = fopen('date/1.dat', 'rb');

$dlugoscRekordu = 5; // 2B (integer (w turbo pascalu) = 16bit) + 3x 1B (shortint (w tp) = 8bit)

while(strlen($rekord = fread($plik, $dlugoscRekordu)) == $dlugoscRekordu)
  print_r(unpack('sczas/cid/cx/cy', $rekord));

fclose($plik);
?>

Dwie zasady gwarantujące sukces:
1. Nigdy nie mów nikomu wszystkiego<span style="color: white">

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0