Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Record diversi in file ad accesso casuale

Utilizzo un programma (scritto in C) che crea ed accede ad un file ad
accesso casuale. In rete ho trovato il tracciato record che mi serve per
accederci da VB per estrarne dei dati.
Fin qui niente di strano. Ho però notato che il file in questione è in
realtà composto da 2 parti: una prima parte di 4096 byte con un unico
record, che contiene dei dati di "testata" riepilogativi, e poi i record
veri e propri, con i dati, organizzati secondo il tracciato record di cui
dispongo.
Mi chiedevo se per un programma che sto sviluppando sia possibile fare la
stessa cosa con un file ad accesso casuale ("for random access") creato e
gestito in VB6 oppure se mi devo rassegnare ad usare un file di testo per i
dati di testata ed un altro per i dati.
Paolo

dati di testata ed un altro per i dati.
  Nulla ti vieta di leggere e scrivere diverse strutture di record in
un unico file in VB, basta che tu sappia leggere e scrivere le
strutture giuste per ogni record...
-- 
  Ciao :-)
  Massimo
Nell'indirizzo, sostituire "micio" con "mc"

 strutture giuste per ogni record...
Tu dici che si puň fare... io attualmente leggo il file su un array cosě:
   Open "c:\miopath\....\....\nomefile.bin" For Random As #hFile Len =
LenB(MioRecord)
   Get #hFile, , MioRecord
   Do
      ReDim Preserve RecArray(UBound(RecArray) + 1)
      RecArray(UBound(RecArray)).campo1 = MioRecord.Campo1
      .....
      Get #hFile, , MioRecord
   Loop Until EOF(hFile)
Come vedi non fornisco il numero del record che intendo leggere, ma, visto
che devo leggere tutto il file, lascio che si arrangi VB. Cosě ovviamente
non puň andare, giusto ?
Immagino che per poter avare piů di un record quanto meno la struttura del
record di "testata" debba avere come lunghezza un multiplo di quella dei
"dati"....
Quindi se fornisco il numero della riga che voglio leggere nel ciclo, nell'
ipotesi che il record "testata" sia di 100 byte e quello dei dati sia lungo
25, potrei partire con uno "spread di +4, quindi il mio primo record di dati
diventa il 5... sono sulla strada giusta ?
Paolo

diventa il 5... sono sulla strada giusta ?
  No. Devi considerare come dimensione quella massima poiche' e'
quella con cui apri il file.


 quella con cui apri il file.
Acc.. in questo modo mi viene un file gigante, perchè nella realtà mi
servirà avere un record "testata" di circa 500 byte, mentre i record dati
sono di 36.
Cioè se ad esempio ho 100 righe di dati avrei: 500byte di testata + (500 *
100) = 50500 byte...
E poi un'altra cosa: il file di cui parlavo all'inizio (quello creato in C)
non rispecchia quanto sopra, in quanto la dimensione è 4096 byte di record
testata + 50 di record dati * numero di record

testata + 50 di record dati * numero di record
  Allora non e' stato scritto come file random nel senso usato in
Basic.


 Basic.
Anche questo è senz'altro possibile...
Mi viene in mente che potrebbe essere stato scritto come file "for binary
access", sempre nel senso usato dal VB, magari costruendosi delle funzioni
che effettuano la get/put ma con la gestione del gap degli xxx byte
iniziali. Qualcosa del tipo "leggi 36 byte partento dal 501" per leggere il
primo record dati..
Ti ringrazio per l'aiuto.
Paolo

Visto che ci siamo, approfitto della tua gentilezza.
private type pippo
   a as string * 3
   b as string * 7
end type
dim recpippo as pippo
Mi sai dire perchè len(recpippo) = 10 e lenB(recpippo) = 20 ?
Mi sono infatti accorto che il file risultante dopo la scrittura è lungo il
doppio di quanto mi aspetto. Infatti al temine di ogni record ho n byte
vuoti quanti sono i byte del record.
E' obbligatorio, nell'aprire il file for random access passare come
lunghezza len = lenB(recpippo) o posso utilizzare len(recpippo) ?
Paolo

> Mi sai dire perchè len(recpippo) = 10 e lenB(recpippo) = 20 ?
Unicode.
Lokar 

> Unicode.
Grazie Lokar. Adesso mi spiego perchè se per definire l'UDT non utilizzo
stringhe len e lenB danno lo stesso valore.
Mi resta però il dubbio se per la lettura/scrittura del file ad accesso
casuale posso utilizzare len() anzichè lenB() che mi fa rispariare un bel
po' di byte.. ed apparentemente non dà errori di lunghezza record errata.
Paolo


Se la mia applicazione resta in Italia, e consento all'utente di digitare
solo numeri e lettere del nostro alfabeto, in teoria potrei soprassedere sul
discordo unicode, e quindi aprire il file binario con len = len(miotipo)
anzichč con LenB ?
Sembra funzionare...