Ottenere i "reali" valori numerici da una lettura di tipo Stringa di un flusso di dati

Da Gambas-it.org - Wikipedia.
Versione del 9 mag 2014 alle 10:35 di Vuott (Discussione | contributi) (Creata pagina con 'Per varie ragioni a volte può essere necessario effettuare una lettura di tali dati come tipo ''Stringa''. Ciò può risultare necessario in modo particolare quando si devono...')

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

Per varie ragioni a volte può essere necessario effettuare una lettura di tali dati come tipo Stringa. Ciò può risultare necessario in modo particolare quando si devono leggere da un file o altro flusso due o più dati che rappresentano per noi significativi, reali valori numerici. In tal caso, quindi, la stringa, ottenuta dalla lettura del flusso di dati, contiene due più valori numerici di qualsiasi tipo (Short, Integer, etc.), che dovranno essere riconvertiti dall'attuale rappresentazione di tipo stringa alla rappresentazione di tipo numerale.

Se i valori numerali possono essere espressi dal tipo Byte, allora per trasformare ogni carattere della stringa, ottenuta dalla precedente lettura del flusso, nel corrispondente reale valore numerico di tipo Byte si potrà utilizzare molto agevolmente il metodo .FromString() appartenente alla Classe Byte[]:

Byte[].FromString(stringa) As Byte[]

che riempirà, quindi, gli elementi di una variabile vettoriale di tipo Byte[] dei valori numerici ottenuti dalla conversione di ogni caratere della stringa.


Nei restanti casi, invece, sarà necessario creare una variabile di tipo Puntatore con la funzione Alloc(), che avrà come parametro la variabile stringa contenente i dati ottenuti dalla precedente lettura del flusso.

Successivamente si provvederà a dereferenziare la variabile Puntatore, per poter ottenere i reali valori numerici.
Se il valore da ottenere è soltanto uno, allora la dereferenziazione potrà avvenire mediante le specifiche funzioni fornite da Gambas (Short@(), int@(), etc.).

Se la stringa contiene più valori numerici da ricavare, allora si dovrà procedere con la dereferenziazione mediante i Memory Stream.
Facciamo un esempio di quest'ultimo caso:

Public Sub Main()

 Dim fl As File
 Dim s As String
 Dim p As Pointer
 Dim st As Stream
 Dim i1, i2 As Integer
 Dim sh As Short
 Dim l As Long
 
 
  fl = Open "/percorso/del/file o flusso/da/leggere" For Read 

' Leggiamo dal flusso e salviamo i dati nella variabile di tipo stringa "s":
  Read #fl, s, -256

' Dalla variabile stringa "s" generiamo una variabile di tipo "Puntatore" mediante la funzione "Alloc()":
  p = Alloc(s)

' Quindi passiamo alla dereferenziazione della variabile di tipo "Puntatore":
  st = Memory p For Read

' Leggiamo dalla variabile di tipo "Stream" (ad esempio se sappiamo che la sequenza dei valori nel flusso è come appresso):
  Read #st, i1
  Read #st, i2
  Read #st, sh
  Read #st, l

' Infine, vediamo in console i "reali" valori numerici:
  Print i1, i2, sh, l


' Va in chiusura:
  st.Close
  Free(p)
  fl.Close

End