Newsgroup: it.comp.lang.delphi
Titolo: Puntatore & C...

Ciao,
Devo leggere un file binario e riconosco il formato di questo file da una
serie di identificatori all'interno di esso.
Io ho implementato questo sistema:
var
    vFileStream: TFileStream;
    vString: string;
begin
                  vFileStream := TFileStream.Create('nomefile.dat',
fmOpenRead);
                   vString := StringOfChar(' ',4);    // creo lo spazio
                   vFileStream.Read(Pointer(vString)^,4);
                   if vString = 'ABCD' then
                   begin
                        ...
                   end;
                   vFileStream.Free;
end;
secondo voi c'č un sistema migliore ?
grazie
Solid Snake

secondo voi c'è un sistema migliore ?
si, lascia stare i puntatori !!
Se mi dici la struttura di questo file binario, ti scrivo due righe di
codice per leggerlo.
In sostanza devi solo leggere tanti byte alla volta per ogni informazioni
memorizzata nel file.
N.B. Quando leggi un file binario, non puoi permetterti di sfasarti nemmeno
di un byte altrimenti quelli
che seguiranno saranno mal interpretati specie se si tratta di numeri.
Magari invece di 100 leggi un numero
che non ci capa proprio nulla !!
Oppure puoi definire un record dove ogni campo ha come dimensione e tipo lo
stesso tipo memorizzato nel file.
A questo punto con un semplice richiamo al metodo Read della classe
TFileStream, leggi le informazioni.
Nel tuo caso, hai definito la variabile "Vstring" come tipo string.
Mi pare che tu devi leggere i primi 4 byte che sono 4 caratteri.
Allora scrivi:
vString : array [0..3] of char;
cancella quella riga con VString:=StringOfChar ecc...
e nel metodo Read scrivi:
VFileStream.Read(vString, SizeOf(VString));
e poi:
if VString = 'ABCD' then
  ecc ecc..
ok ?
Per ulteriori dettagli scrivi nuovamente !!
Ciaoooooo !!!!!
Antonio Tarolla


grazie
la mia struttura è la seguente:
ID = 4 byte
il resto del file è basato su tanti "record" di questo tipo:
TMioRec = record
    primo valore: string[30];
    secondo: integer;
    terzo: string[32];
end;
domanda: se il mio ID fosse stato di 30 caratteri e avrei dovuto
confrontarlo con un valore immesso in un TEdit dall'utente come avresti
agito ?
grazie ancora
Ciao
Solid Snake

agito ?
idem al precedente messaggio.
Magari avrei definito la variabile ID come:
var ID : array [0..29] of Char;
poi per leggere:
var MioFile : TFileStream;
begin
  MioFile:=TFileStream.Create(NomeFile, fmOpenRead);
  MioFile.Read(ID, SizeOf(ID));
  if ( ID = Edit1.Text ) then
   ecc ecc...
end;
Nell'altro messaggio ti avevo anche detto di utilizzare il metodo Read solo
una volta per leggere tutte le informazioni di un singolo record del file.
Bč, fai cosě:
var MioFile : TFileStream;
      MioRec : TMioRec;
      ID          : array [0..29] of Char;   // nel caso fosse 30 caratteri
begin
  MioFile:=TFileStream.Create(NomeFile, fmOpenRead);
  try
    MioFile.Read(ID, SizeOf(ID));
    if ( ID = Edit1.Text ) then
     begin
        // qui magari dovrai fare un ciclo per leggere tutti i record del
file. Per ora leggo solo il primo !!
        MioFile.Read(MioRec, SizeOf(MioRec));
        // ora nella variabile MioRec trovi ( in ogni campo ) i valori letti
da file.
     end;
  finally
    MioFile.Free;
  end;
end;
Credo che possa bastare.
Magari c'č da apportare qualche correzione, tieni conto che quanto ho
scritto, non č passato attraverso Delphi e quindi puň darsi che ci sia
qualche errore. Al limite scrivi nuovamente.
Ti saluto.....ciao !!
Antonio Tarolla

Grazie sei stato molto chiaro e a buon rendere...
Ciao
Solid Snake

Purtroppo c'è ancora qualche problema.
Se creo una struttura di questo genere:
TMioRec = record
    nome: array[0..32] of char;
end;
poi come faccio a fare:
miorec.nome := edit1.text
il compilatore mi da errore !
p.s.: comunque devo smentire quello che hai detto riguardo le definizioni
string[xx] infatti se definisco una struttura di questo genere:
TMioRec = record
    nome: string[32]
end;
il record occupa veramente 32 byte !
grazie
Ciao
Solid SNake

il record occupa veramente 32 byte !
bè, non so che Delphi usi ( che versione ) io con la 3, ottengo 33 byte nel
tuo caso.
Provo a spiegarti com'è la storia.
Il primo carattere della stringa contiene un numero che specifica la
lunghezza della stringa se questa non supera i 255 caratteri.
Infatti essendo solo il primo carattere a contenere questo numero, si tratta
di un byte ed infatti un byte può contenere un numero variabile tra 0 e 255
e quindi è in grado di contenere il valore numerico della stringa.
La stringa in questione è la ShortString. Poi ci sono le Long string ecc...
Ti riporto quanto scritto nell' help:
The element at index 0 contains the dynamic length of the string, and for a
short string, Length(S) is the same as Ord(S[0]).
Capito cosa dice ?
L'elemento con indice 0 contiene la lunghezza dinamica della stringa ed in
pratica la funzione Length(S) restituisce lo stesso risultato di Ord(S[0])
perchè il primo carattere ( [0] ) contiene il valore numerico della
lunghezza delle stringa !! Ok ?
Ti saluto.....ciaoo !!
Antonio Tarolla

 tuo caso.
Io uso delphi4 e se definisco una variabile di tipo "string" automaticamente
questa viene interpretata come "Long String" di conseguenza mi occupa solo i
bytes che servono.
Mi sembra strano che su Delphi 3 non č la stessa cosa. Infatti mi ricordo
che da Delphi 2 era stato superato il problema delle stringhe di max. 255
caratteri.
comunque la mia prova č stata semplice:
ho salvato un file con questa struttura :
TMioRec = record
    nome: string[32];
    numero: integer;
end;
e mi ha salvato 40 bytes ovvero 32 bytes di stringa + 8 di intero e visto
che l'occupazione č la stessa penso di utilizzare questo metodo (mi evito
StrPCopy in giro che potrebbero creare confusione).
comunque grazie lo stesso
Ciao
Solid Snake