Differenze tra le versioni di "Read"

Da Gambas-it.org - Wikipedia.
 
(12 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
'''Read''' legge da un flusso di dati (''[http://gambaswiki.org/wiki/comp/gb/file file]'' o ''[http://gambaswiki.org/wiki/comp/gb/stream stream]''). I dati letti vengono memorizzati in una adeguata variabile:
+
'''READ''' legge da un flusso di dati (''[http://gambaswiki.org/wiki/comp/gb/file file]'' o ''[http://gambaswiki.org/wiki/comp/gb/stream stream]'').
  <FONT Color=#B22222><B>Read</b></font> #file, variabile  <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
+
<BR>I dati letti vengono memorizzati in una adeguata variabile:
 +
  <FONT Color=#B22222><B>Read</b></font> #file, variabile  <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 
La quantità di byte letti dal file è determinata dal [https://gambaswiki.org/wiki/cat/datatypes?l=it tipo di dato], al quale appartiene la variabile ove verranno salvati i dati. Così, se la variabile, destinata a contenere i dati letti dal ''file'' o dallo ''stream'', è di tipo ''[https://gambaswiki.org/wiki/lang/type/byte?l=it Byte]'', verrà letto un solo byte di dati; se è di tipo ''[https://gambaswiki.org/wiki/lang/type/short?l=it Short]'', saranno letti due byte di dati; e così via.
 
La quantità di byte letti dal file è determinata dal [https://gambaswiki.org/wiki/cat/datatypes?l=it tipo di dato], al quale appartiene la variabile ove verranno salvati i dati. Così, se la variabile, destinata a contenere i dati letti dal ''file'' o dallo ''stream'', è di tipo ''[https://gambaswiki.org/wiki/lang/type/byte?l=it Byte]'', verrà letto un solo byte di dati; se è di tipo ''[https://gambaswiki.org/wiki/lang/type/short?l=it Short]'', saranno letti due byte di dati; e così via.
 
<BR>Insomma, la funzione ''Read'' legge una quantità di byte-dati dal file pari alla quantità che può essere memorizzata nella variabile del [https://gambaswiki.org/wiki/cat/datatypes?l=it tipo di dati] come dichiarata e utilizzata.
 
<BR>Insomma, la funzione ''Read'' legge una quantità di byte-dati dal file pari alla quantità che può essere memorizzata nella variabile del [https://gambaswiki.org/wiki/cat/datatypes?l=it tipo di dati] come dichiarata e utilizzata.
 
<BR>Esempio:
 
<BR>Esempio:
  '''Public''' Sub Main()
+
Public Sub Main()
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
 
   Dim i As Integer
 
   Dim i As Integer
 
+
   fl = Open "<Font Color=gray>''/percorso/del/file''</font>" For Read
+
   fl = Open "<Font Color=darkgreen>''/percorso/del/file''</font>" For Read
 
+
 
  <FONT Color=gray>' ''Poiché la variabile "i" è un Intero (''Integer''), "Read" legge dal file una quantità di byte-dati pari al risultato di "SizeOf(gb.Integer)", ossia 4 byte, e li memorizza in quella variabile:''</font>
 
  <FONT Color=gray>' ''Poiché la variabile "i" è un Intero (''Integer''), "Read" legge dal file una quantità di byte-dati pari al risultato di "SizeOf(gb.Integer)", ossia 4 byte, e li memorizza in quella variabile:''</font>
 
   <FONT Color=#B22222><B>Read</b></font> #fl, i
 
   <FONT Color=#B22222><B>Read</b></font> #fl, i
 
+
 
   Print i
 
   Print i
 
+
 
  <Font Color=gray>' ''Chiude il file con l'istruzione "Close":''</font>
 
  <Font Color=gray>' ''Chiude il file con l'istruzione "Close":''</font>
 
   Close #fl
 
   Close #fl
 
+
<Font Color=gray>' ''...oppure con il Metodo ".Close()" della Classe "File":''
  '''End'''
+
  ' '''fl.Close'''</font>
 +
 +
End
 
Salvo diversa impostazione del puntatore del file mediante l'uso della risorsa "[https://gambaswiki.org/wiki/lang/seek?l=it Seek]", la lettura è effettuata a cominciare dal 1° byte di dati (<SPAN Style="text-decoration:underline">indice 0</span>) del ''file'' o dello ''stream''.
 
Salvo diversa impostazione del puntatore del file mediante l'uso della risorsa "[https://gambaswiki.org/wiki/lang/seek?l=it Seek]", la lettura è effettuata a cominciare dal 1° byte di dati (<SPAN Style="text-decoration:underline">indice 0</span>) del ''file'' o dello ''stream''.
  
Riga 25: Riga 28:
  
 
Al termine della lettura il flusso di dati va sempre chiuso con l'apposito Metodo "[https://gambaswiki.org/wiki/comp/gb/stream/close?l=it .Close()]" della Classe ''File'', oppure mediante la risorsa "[https://gambaswiki.org/wiki/lang/close?l=it Close]".
 
Al termine della lettura il flusso di dati va sempre chiuso con l'apposito Metodo "[https://gambaswiki.org/wiki/comp/gb/stream/close?l=it .Close()]" della Classe ''File'', oppure mediante la risorsa "[https://gambaswiki.org/wiki/lang/close?l=it Close]".
 
 
==Leggere tutti i byte del ''file'' o dello ''stream''==
 
==Leggere tutti i byte del ''file'' o dello ''stream''==
 
Se si intende leggere tutti i byte presenti all'interno del file, cioè l'intero file, si potranno adottare diverse modalità.
 
Se si intende leggere tutti i byte presenti all'interno del file, cioè l'intero file, si potranno adottare diverse modalità.
Riga 31: Riga 33:
 
===Uso della funzione "Eof()"===
 
===Uso della funzione "Eof()"===
 
La funzione "[https://gambaswiki.org/wiki/lang/eof?l=it Eof()]" combinata con un ciclo di lettura consente di leggere dati dal file fino al termine di questo, evitando un errore di "''Fine file''".  
 
La funzione "[https://gambaswiki.org/wiki/lang/eof?l=it Eof()]" combinata con un ciclo di lettura consente di leggere dati dal file fino al termine di questo, evitando un errore di "''Fine file''".  
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
Riga 37: Riga 39:
 
   
 
   
 
  <Font Color=gray>' ''Apre il file in lettura e, affinché possa essere gestito, lo carica nella variabile di tipo "File":''</font>
 
  <Font Color=gray>' ''Apre il file in lettura e, affinché possa essere gestito, lo carica nella variabile di tipo "File":''</font>
   fl = Open "<Font Color=gray>''/percorso/del/file''</font>" For Read
+
   fl = Open "<Font Color=darkgreen>''/percorso/del/file''</font>" For Read
 
   
 
   
 
  <Font Color=gray>' ''Avvia un ciclo per leggere tutti i byte fino alla fine del file:''</font>
 
  <Font Color=gray>' ''Avvia un ciclo per leggere tutti i byte fino alla fine del file:''</font>
   While Not <FONT Color=#B22222><B>Eof</b></font>(fl)   <Font Color=gray>' ''Volendo, anche così: '''''While Seek(fl) < Lof(fl)'''</font>
+
   While Not <FONT Color=#B22222><B>Eof</b></font>(fl)
 
   
 
   
  <Font Color=gray>' ''Ad ogni passaggio legge un byte e lo inserisce nella variabile “b“''
+
  <Font Color=gray>' ''Ad ogni passaggio legge un byte e lo inserisce nella variabile “b“ (il puntatore interno del file avanza - in questo caso - di 1 byte ad ogni lettura !):''</font>
' ''(il puntatore interno del file avanza - in questo caso - di 1 byte ad ogni lettura !):''</font>
 
 
     Read #fl, b
 
     Read #fl, b
 
   
 
   
Riga 54: Riga 55:
 
   fl.Close
 
   fl.Close
 
   
 
   
  '''End'''
+
  End
  
 
===Uso della funzione "Lof()"===
 
===Uso della funzione "Lof()"===
 
Usando invece una variabile di tipo stringa combinata con la funzione "[https://gambaswiki.org/wiki/lang/lof?l=it Lof()]", il file sarà letto per la sua intera lunghezza:
 
Usando invece una variabile di tipo stringa combinata con la funzione "[https://gambaswiki.org/wiki/lang/lof?l=it Lof()]", il file sarà letto per la sua intera lunghezza:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
 
   Dim s As String
 
   Dim s As String
 
    
 
    
   fl = Open "<Font Color=gray>''/percorso/del/file''</font>" For Read
+
   fl = Open "<Font Color=darkgreen>''/percorso/del/file''</font>" For Read
 
    
 
    
 
  <Font Color=gray>' ''Leggiamo ogni byte del file come carattere ASCII, per l'intera lunghezza del file medesimo.''
 
  <Font Color=gray>' ''Leggiamo ogni byte del file come carattere ASCII, per l'intera lunghezza del file medesimo.''
Riga 73: Riga 74:
 
   Close #fl
 
   Close #fl
 
    
 
    
  '''End'''
+
  End
 +
oppure anche con un ciclo e la funzione "Seek()" leggendo un byte alla volta:
 +
Public Sub Main()
 +
 +
  Dim fl As File
 +
  Dim b As Byte
 +
 +
  fl = Open "<Font Color=darkgreen>''/percorso/del/file''</font>" For Read
 +
 +
  While Seek(fl) < Lof(fl)
 +
    Read #fl, b
 +
    Print Hex(b, 2)
 +
  Wend
 +
 +
  fl.Close
 +
 +
End
  
 
==Leggere una quantità arbitraria di dati da un ''file''==
 
==Leggere una quantità arbitraria di dati da un ''file''==
Riga 82: Riga 99:
  
 
Esempio:
 
Esempio:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim s As String
 
   Dim s As String
 
   
 
   
   fl = Open "<Font Color=gray>''/percorso/del/file''</font>" For Read  
+
   fl = Open "<Font Color=darkgreen>''/percorso/del/file''</font>" For Read  
 
    
 
    
 
  <FONT color=gray>' ''Legge soltanto i primi dieci byte del file:''</font>
 
  <FONT color=gray>' ''Legge soltanto i primi dieci byte del file:''</font>
Riga 95: Riga 112:
 
   fl.Close
 
   fl.Close
 
   
 
   
  '''End'''
+
  End
 
Se però il file è formato da un numero inferiore di dati-byte rispetto al valore impostato nel terzo argomento della riga di comando di "Read", sarà sollevato un errore "Fine del File" (''End of File'' ).
 
Se però il file è formato da un numero inferiore di dati-byte rispetto al valore impostato nel terzo argomento della riga di comando di "Read", sarà sollevato un errore "Fine del File" (''End of File'' ).
<BR>Per evitare tale errore, bisognerà attribuire al terzo argomento un valore negativo. In tal caso si imposterà la lettura di un numero di dati-byte pari e non superiore a quello del valore del terzo argomento, e comunque non superiore al numero effettivo di dati-byte costituenti il file.
+
<BR>Per evitare tale errore, bisognerà attribuire al terzo argomento un valore <SPAN Style="text-decoration:underline">negativo</span>. In tal caso si imposterà la lettura di un numero di dati-byte pari e non superiore a quello del valore del terzo argomento, e <SPAN Style="text-decoration:underline">comunque non superiore al numero effettivo di dati-byte costituenti il file</span>.
 
  Read #file, variabile_stringa, <FONT color=#B22222><B>-n</b></font>
 
  Read #file, variabile_stringa, <FONT color=#B22222><B>-n</b></font>
<BR>Pertanto, se ad esempio il file è composto da 6 dati-byte e il terzo argomento della riga di comando di "Read" è impostato al numero negativo -8, l'istruzione "Read" proverà a leggere 8 byte, ma avendo il suo terzo argomento con un valore negativo, ed essendo 6 i byte totali effettivamente leggibili, si fermerà all'ultimo byte leggibile, ossia il sesto (indice 5); quindi non eccedente la fine del file.
+
Pertanto, se ad esempio il file è composto da 6 dati-byte e il terzo argomento della riga di comando di "Read" è impostato al numero negativo -8, l'istruzione "Read" proverà a leggere 8 byte, ma avendo il suo terzo argomento con un valore negativo, ed essendo 6 i byte totali effettivamente leggibili, si fermerà all'ultimo byte leggibile, ossia il sesto (indice 5); quindi non eccedente la fine del file.
  
 
===Usando il ciclo "While...Wend"===
 
===Usando il ciclo "While...Wend"===
 
Se si intende leggere un byte per volta si utilizzerà anche un ciclo "[https://gambaswiki.org/wiki/lang/while?l=it While...Wend]":
 
Se si intende leggere un byte per volta si utilizzerà anche un ciclo "[https://gambaswiki.org/wiki/lang/while?l=it While...Wend]":
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim s As String
 
   Dim s As String
 
   
 
   
   fl = Open "<Font Color=gray>''/percorso/del/file''</font>" For Read
+
   fl = Open "<Font Color=darkgreen>''/percorso/del/file''</font>" For Read
 
   
 
   
 
   While Not Eof(fl)
 
   While Not Eof(fl)
Riga 116: Riga 133:
 
   fl.Close
 
   fl.Close
 
   
 
   
  '''End'''
+
  End
  
 
==Leggere uno specifico byte all'interno del ''file'' o dello ''stream''==
 
==Leggere uno specifico byte all'interno del ''file'' o dello ''stream''==
Riga 122: Riga 139:
 
<BR>In questo modo il puntatore interno del file si sposterà sul byte-dato di indice indicato nel secondo elemento sintattico della funzione ''Seek''.
 
<BR>In questo modo il puntatore interno del file si sposterà sul byte-dato di indice indicato nel secondo elemento sintattico della funzione ''Seek''.
  
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
 
   Dim b As Byte
 
   Dim b As Byte
 
    
 
    
   fl = Open "<Font Color=gray>''/percorso/del/file''</font>" For Read
+
   fl = Open "<Font Color=darkgreen>''/percorso/del/file''</font>" For Read
 
    
 
    
 
  <Font Color=gray>' ''Si scelge di leggere il valore del 4° byte (indice 3) del file:''</font>
 
  <Font Color=gray>' ''Si scelge di leggere il valore del 4° byte (indice 3) del file:''</font>
Riga 140: Riga 157:
 
   fl.Close
 
   fl.Close
 
    
 
    
  '''End'''
+
  End
  
 
==Leggere un file con READ e salvarne i dati in una Struttura==
 
==Leggere un file con READ e salvarne i dati in una Struttura==
E' possibile leggere un file e salvarne i dati direttamente e in un solo momento in una "[https://gambaswiki.org/wiki/lang/struct?l=it Struttura]" adeguatamente costruita. <SUP>&#091;[[#Note|Nota 2]]&#093;</sup>
+
E' possibile leggere un file e salvarne i dati direttamente e in un solo momento in una "[https://gambaswiki.org/wiki/lang/struct?l=it Struttura]" adeguatamente costruita. <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
 
<BR>Si adopererà la sintassi:
 
<BR>Si adopererà la sintassi:
 
  variabile_struttura Read #file As Nome_della_Struttura
 
  variabile_struttura Read #file As Nome_della_Struttura
Riga 155: Riga 172:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim fl As File
 
   Dim fl As File
 
   Dim vst As STRUTTURA
 
   Dim vst As STRUTTURA
 
    
 
    
   fl = Open "<FONT Color=gray>''/percorso/del/file/da/leggere''</font>" For Read
+
   fl = Open "<FONT Color=darkgreen>''/percorso/del/file/da/leggere''</font>" For Read
 
    
 
    
 
   <FONT Color=#B22222>vst = Read #fl As STRUTTURA</font>
 
   <FONT Color=#B22222>vst = Read #fl As STRUTTURA</font>
Riga 169: Riga 186:
 
   fl.Close
 
   fl.Close
 
    
 
    
  '''End'''
+
  End
  
===Leggere da un file dati e assegnarli a un membro di tipo array===
+
===Leggere da un file dati e assegnarli a un membro di tipo array di una Struttura===
Va ricordato che, per assegnare dati - letti da un file - un membro array di una ''Struttura'', non è possibile utilizzare come membro [https://gambaswiki.org/wiki/cat/array?l=it array normale] di Gambas:
+
Va ricordato che, per assegnare dati - letti da un file - a un membro array di una ''Struttura'', non è possibile utilizzare come membro un [https://gambaswiki.org/wiki/cat/array?l=it array nativo] di Gambas:
 
  Public Struct STRUTTURA
 
  Public Struct STRUTTURA
 
   ...
 
   ...
  membro As Integer[] <FONT Color=gray>''oppure con numero di elementi dichiarati''</font>
+
<FONT Color=gray>' ''Senza numero di elementi dichiarati:''</font>
 +
  membro As Integer[]   <FONT Color=red><B>Errore !</b></font>
 +
<FONT Color=gray>' ''oppure con numero di elementi dichiarati:''</font>
 +
  membro As Integer[16] <FONT Color=red><B>Errore !</b></font>
 
   ...
 
   ...
 
  End Struct
 
  End Struct
Bisogna invece usare gli array "annidati":
+
Bisogna invece usare gli array "<SPAN Style="text-decoration:underline>annidati</span>":
 
  Public Struct STRUTTURA
 
  Public Struct STRUTTURA
 
   ...
 
   ...
  membro[16] As Integer
+
  membro[16] As Integer <FONT Color=darkgreen><B>Corretto !</b></font>
 
   ...
 
   ...
 
  End Struct
 
  End Struct
 +
 +
 +
==Errore di Segmentazione usando la modalità "vettore = Read #variabile_file As Byte[]"==
 +
Nel caso in cui, per assegnare i dati di un file a un vettore, si usi la modalità:
 +
vettore = Read #flusso As Byte[]
 +
oppure:
 +
vettore = Read #flusso As Array
 +
verrà sollevato un "Errore di Segmentazione".
  
  
Riga 190: Riga 218:
 
=Note=
 
=Note=
 
[1] Da notare che:
 
[1] Da notare che:
* in una istruzione ''<Font Color= #B22222>READ #varFile, variabile</font>'', noi leggiamo il valore contenuto in "''#varFile''" e lo scriviamo in "''variabile''" (scriviamo, cioè, in "''variabile''" il valore presente in "''varFile''";
+
* in una istruzione ''<Font Color= #B22222>READ #varFile, variabile</font>'', noi leggiamo il valore contenuto in "''#varFile'' " e lo scriviamo in "''variabile'' " (scriviamo, cioè, in "''variabile'' " il valore presente in "''varFile'' ";
* in una istruzione ''<Font Color= #B22222>WRITE #varFile, variabile</font>'', noi leggiamo il valore contenuto in "''variabile''" e lo scriviamo in "''#varFile''" (scriviamo, cioè, in "''varFile''" il valore presente in "''variabile''").
+
* in una istru zione ''<Font Color= #B22222>WRITE #varFile, variabile</font>'', noi leggiamo il valore contenuto in "''variabile'' " e lo scriviamo in "''#varFile'' " (scriviamo, cioè, in "''varFile'' " il valore presente in "''variabile''").
  
[2] Vedere anche questa analoga pagina della wiki: [[Assegnare_direttamente_i_valori_di_dimensione_conosciuta,_letti_da_un_file,_ad_una_Struttura|Assegnare direttamente i valori di dimensione conosciuta, letti da un file, ad una Struttura]]
+
[2] Vedere anche questa analoga pagina della wiki: [[Assegnare direttamente i valori di dimensione conosciuta, letti da un file, ad una Struttura]]
  
  

Versione attuale delle 16:36, 17 ott 2024

READ legge da un flusso di dati (file o stream).
I dati letti vengono memorizzati in una adeguata variabile:

Read #file, variabile   [nota 1]

La quantità di byte letti dal file è determinata dal tipo di dato, al quale appartiene la variabile ove verranno salvati i dati. Così, se la variabile, destinata a contenere i dati letti dal file o dallo stream, è di tipo Byte, verrà letto un solo byte di dati; se è di tipo Short, saranno letti due byte di dati; e così via.
Insomma, la funzione Read legge una quantità di byte-dati dal file pari alla quantità che può essere memorizzata nella variabile del tipo di dati come dichiarata e utilizzata.
Esempio:

Public Sub Main()

 Dim fl As File
 Dim i As Integer

 fl = Open "/percorso/del/file" For Read

' Poiché la variabile "i" è un Intero (Integer), "Read" legge dal file una quantità di byte-dati pari al risultato di "SizeOf(gb.Integer)", ossia 4 byte, e li memorizza in quella variabile:
 Read #fl, i

 Print i

' Chiude il file con l'istruzione "Close":
 Close #fl
' ...oppure con il Metodo ".Close()" della Classe "File":
' fl.Close

End

Salvo diversa impostazione del puntatore del file mediante l'uso della risorsa "Seek", la lettura è effettuata a cominciare dal 1° byte di dati (indice 0) del file o dello stream.

Va ricordato che ad ogni lettura con Read il puntatore interno del file avanza di una quantità di byte pari alla quantità di byte di dati letti.

Al termine della lettura il flusso di dati va sempre chiuso con l'apposito Metodo ".Close()" della Classe File, oppure mediante la risorsa "Close".

Leggere tutti i byte del file o dello stream

Se si intende leggere tutti i byte presenti all'interno del file, cioè l'intero file, si potranno adottare diverse modalità.

Uso della funzione "Eof()"

La funzione "Eof()" combinata con un ciclo di lettura consente di leggere dati dal file fino al termine di questo, evitando un errore di "Fine file".

Public Sub Main()

 Dim fl As File
 Dim b As Byte

' Apre il file in lettura e, affinché possa essere gestito, lo carica nella variabile di tipo "File":
 fl = Open "/percorso/del/file" For Read

' Avvia un ciclo per leggere tutti i byte fino alla fine del file:
 While Not Eof(fl)

' Ad ogni passaggio legge un byte e lo inserisce nella variabile “b“ (il puntatore interno del file avanza - in questo caso - di 1 byte ad ogni lettura !):
   Read #fl, b

 ' Mostra a fini didattici i byte in formato esadecimale:
   Print Hex(b, 2)

 Wend

' Chiude il file questa volta con il Metodo ".Close()" della Classe "File":
 fl.Close

End

Uso della funzione "Lof()"

Usando invece una variabile di tipo stringa combinata con la funzione "Lof()", il file sarà letto per la sua intera lunghezza:

Public Sub Main()

 Dim fl As File
 Dim s As String
  
 fl = Open "/percorso/del/file" For Read
  
' Leggiamo ogni byte del file come carattere ASCII, per l'intera lunghezza del file medesimo.
' Avremo quindi per ogni byte un valore di tipo "String":
 Read #fl, s, Lof(fl)
  
 Print s
 
 Close #fl
  
End

oppure anche con un ciclo e la funzione "Seek()" leggendo un byte alla volta:

Public Sub Main()

 Dim fl As File
 Dim b As Byte

 fl = Open "/percorso/del/file" For Read

 While Seek(fl) < Lof(fl)
   Read #fl, b
   Print Hex(b, 2)
 Wend

 fl.Close

End

Leggere una quantità arbitraria di dati da un file

All'inizio si è detto che la quantità di dati letti da un da un file è determinata dal tipo di variabile. Se si intende, invece, far leggere una quantità da noi stabilita di dati, sarà necessario leggerli come caratteri ASCII e salvarli conseguentemente in una variabile di tipo String.
Il numero di byte-dati da leggere sarà impostato nel terzo parametro della riga di comando di "Read":

Read #variabile_file, variabile_stringa, n

laddove n rappresenta appunto la quantità di byte da leggere a partire dal primo (indice 0).

Esempio:

Public Sub Main()

 Dim s As String

 fl = Open "/percorso/del/file" For Read 
 
' Legge soltanto i primi dieci byte del file:
 Read #fl, s, 10

 Print s

 fl.Close

End

Se però il file è formato da un numero inferiore di dati-byte rispetto al valore impostato nel terzo argomento della riga di comando di "Read", sarà sollevato un errore "Fine del File" (End of File ).
Per evitare tale errore, bisognerà attribuire al terzo argomento un valore negativo. In tal caso si imposterà la lettura di un numero di dati-byte pari e non superiore a quello del valore del terzo argomento, e comunque non superiore al numero effettivo di dati-byte costituenti il file.

Read #file, variabile_stringa, -n

Pertanto, se ad esempio il file è composto da 6 dati-byte e il terzo argomento della riga di comando di "Read" è impostato al numero negativo -8, l'istruzione "Read" proverà a leggere 8 byte, ma avendo il suo terzo argomento con un valore negativo, ed essendo 6 i byte totali effettivamente leggibili, si fermerà all'ultimo byte leggibile, ossia il sesto (indice 5); quindi non eccedente la fine del file.

Usando il ciclo "While...Wend"

Se si intende leggere un byte per volta si utilizzerà anche un ciclo "While...Wend":

Public Sub Main()

 Dim s As String

 fl = Open "/percorso/del/file" For Read

 While Not Eof(fl)
   Read #fl, s, 1
   Print s;
 Wend

 fl.Close

End

Leggere uno specifico byte all'interno del file o dello stream

Se invece si intende effettuare la lettura cominciando da uno specifico byte all'interno del file, si dovrà usare anche la funzione "Seek".
In questo modo il puntatore interno del file si sposterà sul byte-dato di indice indicato nel secondo elemento sintattico della funzione Seek.

Public Sub Main()

 Dim fl As File
 Dim b As Byte
  
 fl = Open "/percorso/del/file" For Read
  
' Si scelge di leggere il valore del 4° byte (indice 3) del file:
 Seek #fl, 3

' Legge il valore del byte puntato da "Seek":
 Read #fl, b
  
 Print b
  
' Chiude il file:
 fl.Close
  
End

Leggere un file con READ e salvarne i dati in una Struttura

E' possibile leggere un file e salvarne i dati direttamente e in un solo momento in una "Struttura" adeguatamente costruita. [nota 2]
Si adopererà la sintassi:

variabile_struttura Read #file As Nome_della_Struttura

Mostriamo un esempio, nel quale in un file sono contenuti i dati dei seguenti tipi: uno Short, un Integer e un Long.
Pertanto la lettura del file e la successiva scrittura dei dati nella Struttura avverà così:

Public Struct STRUTTURA
  s As Short
  i As Integer
  l As Long
End Struct


Public Sub Main()
 
 Dim fl As File
 Dim vst As STRUTTURA
 
 fl = Open "/percorso/del/file/da/leggere" For Read
 
 vst = Read #fl As STRUTTURA
 
' Effettua la verifica:
 Print vst.s, vst.i, vst.l
 
 fl.Close
 
End

Leggere da un file dati e assegnarli a un membro di tipo array di una Struttura

Va ricordato che, per assegnare dati - letti da un file - a un membro array di una Struttura, non è possibile utilizzare come membro un array nativo di Gambas:

Public Struct STRUTTURA
  ...
' Senza numero di elementi dichiarati:
 membro As Integer[]   Errore !
' oppure con numero di elementi dichiarati:
 membro As Integer[16] Errore !
  ...
End Struct

Bisogna invece usare gli array "annidati":

Public Struct STRUTTURA
  ...
 membro[16] As Integer  Corretto !
  ...
End Struct


Errore di Segmentazione usando la modalità "vettore = Read #variabile_file As Byte[]"

Nel caso in cui, per assegnare i dati di un file a un vettore, si usi la modalità:

vettore = Read #flusso As Byte[]

oppure:

vettore = Read #flusso As Array

verrà sollevato un "Errore di Segmentazione".



Note

[1] Da notare che:

  • in una istruzione READ #varFile, variabile, noi leggiamo il valore contenuto in "#varFile " e lo scriviamo in "variabile " (scriviamo, cioè, in "variabile " il valore presente in "varFile ";
  • in una istru zione WRITE #varFile, variabile, noi leggiamo il valore contenuto in "variabile " e lo scriviamo in "#varFile " (scriviamo, cioè, in "varFile " il valore presente in "variabile").

[2] Vedere anche questa analoga pagina della wiki: Assegnare direttamente i valori di dimensione conosciuta, letti da un file, ad una Struttura


Riferimenti