Newsgroup: it.comp.www.php
Titolo: Record tipizzati

Chiedo a voi che ne sapete molto di piu'....
dunque con php nessun problema per la gestione di file di testo ma mi sono impantanato sulla gestione di file tipizzati.
E' possibile gestirli interamente con php o mi devo creare un GCI ad hoc? C'e' in giro qualche esempio?
--
Ciao,
David (
www.utilityweb.net
)

David wrote:

Prova a spiegarti meglio, chessň con un esempio.
-- 
Spoken: How much is that gorilla in the window?
Take our advice, At any price, A gorilla like Magilla is mighty nice.
Gorilla, Magilla Gorilla for sale

> Prova a spiegarti meglio, chessò con un esempio.
Dunque i file tipizzati sono file composti da vari record tutti uguali i quali hanno una struttura data dall'operatore
per esempio (scusate il pseudo pascal)
MioRecord = record
                         campo1 : stringa[20]
                         campo2 : integer;
                         campo3 : carattere
                     end
la cosa comoda di questi tipi di file (almeno su linguaggi quali C, Pascal, Delphi, etc..) è che posso leggere o
scrivere un record specifico in maniera molto semplice
Esempio:
Se voglio fare una cosa del tipo:
   Apro il mio file di tipo MioRecord
   Vado direttamente nella posizione 10
   Leggo il record
   Lo modifico
   Scrivo il record nella posizione 10
- sempre in pseudo pascal - scrivero':
Open(File1)      - File1 è dichiarato come File di MioRecord
Seek(9)            - Vado alla 10a posizione (0 è la prima)
Read(Rec)        - leggo il record
- qui' ci lavoro -
Seek(9)            - Torno alla 10a posizione (0 è la prima)
Write(Rec)       - scrivo il record
Quello che chiedo è se esiste una maniera di lavorare sui file in php simile a questa
--
Ciao,
David (
www.utilityweb.net
)

 
Non puoi usare un database?


                          campo3 : carattere
Puoi usare al posto di campox la riga del file. Cosě poi modifichi la 
lianea x o y come un campo.
Meglio sarebbe appunto con un database
-- 
                   |||
                  (0.0)
|-------------o00----00o-----------------------------|
|Stefano Alberto Russo - Liceo Oberdan - Trieste     |
|
www.terra32.net
 - webmaster @ 
www.acquariofilia.biz
 |
|----------------------------------------------------|

> Non puoi usare un database?
Purtroppo no in quanto dovrei pagare una somma aggiuntiva e, visto che il sito è più che amatoriale, preferisco
risparmiare
--
Ciao,
David (
www.utilityweb.net
)

> ----------------------------------------------------|
--
Ciao,
David (
www.utilityweb.net
)

 risparmiare
www.dotgeek.org
php5 e postgreSQL e altro
Gratis
Eviti di impazzire con file di testo.
Oppure organizzati con XML.
Oppure ti fai un tuo formato ed ogni volta ti riscrivi tutto il file. 
Imho non ne vale la pena


Grazie a tutti per le risposte ora vedro' di inventarmi qualche cosa
--
Ciao,
David (
www.utilityweb.net
)

David wrote:

se opti per memorizzare il tutto in un file..
prova a leggere/scrivere i dati cosi'
ma dovresti rendere la lunghezza dei campi fissa come nell'altro metodo
altrimenti perderai molto tempo nella ricerca dei dati..
<?
$rl = fopen('data.txt', 'a+');
$rr = fopen('data.txt', 'r');
$var = array('campo1'=>'test0', 'campo2'=>'test1');
fwrite($rl, serialize($var) . "\r\n");
while($line = fgets($rr)) print_r(unserialize($line));
?>
 
cmq è 100 volte meglio un database
--
www.iuz-lab.info

Quello che chiedo è se esiste una maniera di lavorare sui file in php simile a questa
http://it.php.net/fseek
http://it.php.net/manual/en/function.fread.php
http://it.php.net/manual/en/function.fwrite.php
In fseek non usi la posizione del tuo record, ma il byte da cui parte
all'interno del file calcolato con posizione e dimensione del record.
Con fread e fwrite leggi/scrivi un numero di bytes pari alla
dimensione del record/campi del record.
Record 1, dimensione record 100 bytes, leggi dal byte 100 (parti da 0
sia come n.rec che come n.bytes)
Il primo campo del record e' una stringa di 10 caratteri, leggi 10
bytes e li salvi nel campo, etc. (uso di buffers ed eventuali altri
metodi tipo convesione di data types a scelta o necessita').
'bye

Grazie era quello che mi serviva ora mi costruisco delle funzioni ad hoc
--
Ciao,
David (
www.utilityweb.net
)

 E' possibile gestirli interamente con php o mi devo creare un GCI ad hoc? C'e' in giro qualche esempio?
XML?

 altrimenti perderai molto tempo nella ricerca dei dati..
ho scritto una classe (occhio che è allo stato grezzo) probabilmente la
dovrai modificare, o meglio, scrivere da capo..
<?
echo '<pre>';
// se il file non è vuoto ed è da inizializzare fai girare una volta
// fopen($file_name, 'w');
class virtual_database{
    var $rl;
    var $record_lenght;
    var $ph_mask;
    function virtual_database($file_name, $read_key_mask){
        $this->rl = fopen($file_name, 'a+');
        $this->ph_mask = explode(',', $read_key_mask);
        while(list(, $lenght) = each($this->ph_mask)) $this->record_lenght
+= $lenght;
        reset($this->ph_mask);
    }
    function read_record($position){
        fseek($this->rl, $position * $this->record_lenght, SEEK_SET);
        $record = fread($this->rl, $this->record_lenght);
        reset($this->ph_mask);
        while(list(, $value) = each($this->ph_mask)){
            $return_array[] = trim(substr($record, 0, $value));
            $record = substr($record, $value);
        }
        return($return_array);
    }
    function write_record($record = array()){
        fseek($this->rl, 0, SEEK_END);
        while(list($key, $value) = each($record)){
            while(strlen($value) < $this->ph_mask[$key]) $value .= ' ';
            fwrite($this->rl, $value, $this->ph_mask[$key]);
        }
    }
}
// si connette al file e imposta una chiave di lettura dei campi uguale a
// campo1[lunghezza 10] campo2[lunghezza 12]
$test = new virtual_database('data.txt', '10,12');
$var = array('test0','test1');
$test->write_record($var);
print_r($test->read_record(0));
?>
--
www.iuz-lab.info