Leggere un file con READ

Da Gambas-it.org - Wikipedia.

Se si intende leggere tutti i byte presenti all'interno del file, cioè l'intero file:

Public Sub Main()

 Dim fl As File
 Dim b As Byte

' legge il file e lo carica nella variabile As File: "intfile"
  fl = Open "/percorso/del/file" For Read

' avvia un ciclo per leggere tutti i byte...fino alla fine del file	

  While Not Eof(fl)   ' Volendo, anche così: While Seek(fl) < Lof(fl)

' Ad ogni passaggio legge un byte e lo inserisce in “b“
' (il puntatore interno di Read avanza la lettura di un byte ad ogni passaggio) e...
    Read #fl, b   [Note 1]

 ' ...ne mostra i byte in formato esadecimale.
 ' mostra le due cifre per ogni valore esadecimale:
    Print Hex(b, 2)

  Wend

' chiude il file:
  fl.Close

End


Se si vuole leggere tutto il file, ma un byte dopo l'altro solo ogni volta che si preme un tasto:

Private fl As File


Public Sub Form_Open()

' legge il file e lo carica nella variabile As File: "intfile"
  fl = Open "/percorso/del/file" For Read

End


Public Sub Button1_Click()

Dim b As Byte
 
' Ad ogni clic sul tasto legge un byte, e lo inserisce nella variabile “b“
' (il puntatore interno di Read avanza la lettura di un byte ad ogni passaggio) e...
   Read #fl, b

'...ne mostra il byte (questa volta in valore decimale):
     Print b

End


Public Sub Button2_Click()

' Chiude il file:
   fl.Close

End


Leggere un file in rappresentazione stringa

Se si intende leggere tutti i byte del file, però non più come valori di tipo Byte, bensì come caratteri ASCII (quindi di tipo String) corrispondenti al valore di ciascun byte, il file sarà letto come un'intera stringa:

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

  fl.Close

End


Si potrà anche adottare un ciclo While...Wend ed inserire nel terzo elemento sintattico un numero negativo. In tal caso verrà letta una quantità di byte per volta, indicata dal valore -n di tipo 8bit, comunque di fatto non eccedente la fine del file, evitando così l'errore "End of file". La combinazione di quel valore negativo con il ciclo While...Wend consente di leggere l'intero file senza provocare quell'errore di fine file.

Public Sub Main()

 Dim s As String


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

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

  fl.Close

End


Leggere soltanto una quantità di byte all'interno del file

Se all'interno di un file si intende leggere in rappresentazione stringa soltanto una quantità ben determinata di byte, allora si utilizzerà la seguente modalità:

Read #variabile_file, variabile_stringa, n

laddove n rappresenta la quantità di byte da leggere a partire dal primo.


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


In modo analogo 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

Se invece si intende effettuare la lettura cominciando da uno specifico byte all'interno del file, si dovrà usare anche la funzione "Seek":

Public Sub Main()

 Dim fl As File
 Dim b As Byte

' legge il file e lo carica nella variabile As File: "intfile"
  fl = Open "/percorso/del/file" For Read

' si scelge di leggere il valore del byte n. 3, ossia del "quarto" byte (infatti il conteggio inizia da zero: 0, 1, 2, 3, etc, etc):
  Seek #fl, 3

' legge il valore del byte puntato da Seek e...
  Read #fl, b

' ...lo mostra in console in decimale:
  Print b

' Chiude il file:
  fl.Close

End



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 istruzione WRITE #varFile, variabile, noi leggiamo il valore contenuto in "variabile" e lo scriviamo in "#varFile" (scriviamo, cioè, in "varFile" il valore presente in "variabile").