Newsgroup: it.comp.lang.visual-basic
Titolo: Come scrivere e leggere array sul disco in un colpo solo...

Non si sa mai se a qualcuno potesse servire...e' la soluzione che ho
trovato al problema che ho esposto poco sotto, magari si sapeva gia',
ma repetita juvant...
In sintesi, il problema era: ho un array (di stringhe, ma si applica a
tutti gli array) che voglio salvare su disco e ricaricare quando mi fa
comodo.
Sintomi del problema:
1) L'array con Random e Put non si salva perche' da' Bad Record Lenght.
2) L'array con Binary si salva ma non Get non lo si riesce a leggere
3) Girarci intorno salvando un elemento alla volta e' da microcefali
Soluzione:
Non sta scritto nei doc e nell'MSDN ma Put e Get, in modalita' Random,
non sono in grado di leggere e scrivere piu' dei canonici 32768 byte.
In realta' lo si puo' capire dal fatto che il parametro Len e' un
intero, ma visto che e' opzionale uno tende a non farci caso.
Quindi, volendo salvare un'array di piccole dimensioni (cioe' di piu'
di 32Kbyte), l'unica soluzione e' usare il Binary.
Pero', e qui sta il "trucco", il Binary e' progettato in modo da non
scrivere nessuna informazione riguardo ai dati salvati; salva solo i
dati, ma nessun descrittore che permetta di ricostruirli in un array.
Ragion per cui, se fate un Put di un'array valido questi viene scritto
correttamente, ma se fate il Get di quanto salvato otterrete un array
vuoto.
La soluzione, banale banale, consiste nel salvarsi da solo un valore
long contenente la dimensione dell'array e poi fare un redim prima
della lettura.
Scrittura:
lngTemp = UBound(rngArrayDaSalvare)
Open file For Binary as #1
Put #1, , lngTemp
Put #1, , rngArrayDaSalvare
Close #1
Lettura:
Open file For Binary as #1
Get #1, , lngTemp
Redim rngArrayDaSalvare(lngTemp)
Get #1, , rngArrayDaSalvare
Close #1
Spero sia stato utile a qualcuno.
Ma quando caspita esce VB7??? :-\

 Ma quando caspita esce VB7??? :-\
Ehm... mai sentito parlare di vb2005? (versione 8.0 se non sbaglio?)


Si.
Primo, si basa su .Net
Quindi, di fronte a vantaggi pressoche' inesistenti per la
piccola/media programmazione, ho gli svantaggi di generare software
piu' pesante, piu' lento e di dover buttar via tonnellate di codice
prodotto in 10 anni di lavoro. Ah, ed aggiungici anche lo svantaggio di
ricominciare a scrivere badilate di Bug, visto che il linguaggio a VB6
ci somiglia ma anche no, cosi' se scrivi una cosa in realta' ne scrivi
un'altra.
Secondo, l'IDE e' lento da paura (rispetto all'IDE di VB6).
No, sono fermamente convinto che prima o poi (piu' prima che poi)
Microsoft se ne uscira bella bella con VB7...

 Secondo, l'IDE e' lento da paura (rispetto all'IDE di VB6).
Questa non ha quasi senso. Prendi eclipse: editor per java. Ha una 
potenza che l'ide vb6 non può nemmeno sognarsi!

 Microsoft se ne uscira bella bella con VB7...
Sono in molti a dire questa cosa.
Molto piu prosaicamente, io penso che qualcuno che si occupa di binalncio a
redmond, prima o poi si accorgerà, da una qualche ricerca di mercato, che ci
sarebbero 1 milione di potenziali clienti di vbnet.xx e 10 milioni di
potenziali acquirenti di un ipotetico vb7. Da li il passo sarà breve.
E la cosa che mi intriga di più sarebbe di vedere la campagna pubblicitaria
:)
-- 
Greg

 :)
Immagini, per caso, una cosa alla tipo Apple?
"Buttate nel cesso quella merda di framework!"

 della lettura.
Ho fatto una prova perchè ricordo di averci perso un paio d'ore anch'io a 
suo tempo.
Il discorso è questo: in realtà salvando l'array nudo e crudo VB si salva il 
descrittore sulle dimensioni di ciascun campo ma non la lunghezza dell'array 
stesso, altrimenti non saprebbe come dividere le stringhe.
Come ti sei accorto è necessario conoscere in qualche modo la dimensione 
dell'array prima di rileggero.
Un trucchetto che ti evita la cosa è questo: usare una struttura anzichè il 
solo array:
Private Type T
    a() As String
End Type
...
    Dim v As T
    ReDim a.a(2)
    v.a(0) = "ciao"
    v.a(1) = "bella"
    v.a(2) = "come va?"
    Open "c:\test.txt" For Binary As #1
    Put #1, 1, v
    Close #
    Open "c:\test.txt" For Binary As #1
    Get #1, 1, v
    Close #1
in questo modo VB è rifrendosi a un livello superiore (il type) è costretto 
a inserire le info anche dell'array e quindi la lettura è più trasparente.
Personalmente il binary è l'unico modo che uso per scrivere e leggere file 
(tranne casi particolari molto semplici tipo log ti testo) perchè permette 
un controllo molto superiore sui dati trattati.
Ciao