Leggere un file di testo

Da Gambas-it.org - Wikipedia.

Fra le varie modalità per effettuare la lettura di dati da un file di testo (leggere in rappresentazione stringa un file), possiamo annoverare anche queste esposte appresso.

Con il metodo File.Load

L'uso del Metodo ".Load( )" della Classe File è certamente il modo più semplice per leggere un file di testo.

Public Sub Button1_Click()

 Dim s As String

  s = File.Load("/percorso/del/file/di/testo")

End


Con "Open....For Read/Input" e "Line Input"

Public Sub Button1_Click()

 Dim fl As File  
 Dim s$ As String 
 

  fl = Open "/percorso/del/file/di/testo" For Read   ' ...oppure "Input"
 
' Compie il ciclo fin tanto che non è giunto alla fine del file:
  While Not Eof(fl)
' "Line Input" legge le stringhe in un File di testo fino al carattere di "nuova linea a capo":
    Line Input #fl, s$
' Mostra il contenuto della variabile s$ in una "TextArea":
     TextArea1.Text = TextArea1.Text & s$ & "\n"
  Wend

  fl.Close

End


Con "Open....For Read/Input" e "Read", -256

In Gambas 3 riguardo alla specificazione di un numero negativo nel terzo elemento sintattico (numero di byte di legge per volta) dell'istruzione Read

Read #file, stringa, -n

la documentazione ufficiale dice: " If Length is negative, then at most (- Length) bytes are read until the end of the stream. "

In sostanza, 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, dunque, di leggere l'intero file senza provocare quell'errore di fine file.

Public Sub Button1_Click()

 Dim fl As File  
 Dim s$ As String 
 

  fl = Open "/percorso/del/file/di/testo" For Read   ' ...oppure "Input"

 While Not Eof(fl)
   Read #fl, s$, -256
' Mostra il contenuto della variabile s$ in una "TextArea":
   TextArea1.Text = TextArea1.Text & s$ & "\n"
  Wend
 
  fl.Close

  End


Con "Open....For Read/Input" e "Read......, Lof()"

Come terzo elemento sintattico di Read, indicante la quantità di byte da leggere volta per volta, viene in questo caso posta la funzione Lof() con argomento il flusso medesimo. Il numero di byte da leggere, dunque, è uguale alla lunghezza dello flusso aperto, ossia la dimensione dell'intero file:

Public Sub Button1_Click()

 Dim fl As File  
 Dim s$ As String 
 

  fl = Open "/percorso/del/file/di/testo" For Read   ' ...oppure "Input"

   Read #fl, s$, Lof(fl)

   Print s$
  
   fl.Close

End


Con "Open....For Read" e "Stat().Size"

Similmente al caso prima visto, nel quale si è quantificata mediante la funzione Lof() l'entità dei byte da leggere, è possibile utilizzare la proprietà .Size della funzione Stat().
Tale proprietà ritorna la dimensione di un file.

Public Sub Button1_Click()

 Dim fl As File  
 Dim s As String
 

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

   Read #fl, s$, Stat("/percorso/del/file/di/testo").Size

   Print s
  
   fl.Close

End


Se si vuole utilizzare un ciclo While...Wend e leggere un byte per volta da convertire in carattere ASCII, si potrà scrivere così:

Public Sub Main()

 Dim fl As File
 Dim b As Byte
 Dim s As String


  s = "/percorso/del/file/di/testo"
 
  fl = Open s For Read

  While Seek(fl) < Stat(s).Size   ' 'ma anche più semplicemente con: Not Eof(Fl)
    Read #fl, b
    Print Chr(b);
  Wend

End


Con "Open....For Read/Input" e "Input"

Public Sub Button1_Click()

 Dim fl As File  
 Dim s$ As String
 Dim ss$ As New String[]
 Dim j As Byte


  fl = Open "/percorso/del/file/di/testo" For Read   ' ...oppure "Input"


While Not Eof(fl)
  Input #fl, s$
' Poiché "Input" legge le stringhe in un File di testo fino all'interruzione dello spazio o al carattere di "nuova linea",
' ogni parola del testo, delimitata da uno spazio, viene individuata e caricata in un nuovo elemento della variabile-array ss$:
  ss$.Add(s$)
 Wend
 
  Close #fl

' Mostra in una "TextArea" ogni stringa contenuta in ciascun elemento della variabile-array ss$:
  For j = 0 To ss$.Max
    TextArea1.Text = TextArea1.Text & ss$[j] & "\n"
  Next
  
End


Uso del metodo .ReadLine() della Classe Stream

Si potrà anche usare il metodo .ReadLine() della classe Stream, ma comunque applicabile anche per le variabili di tipo File. In particolare il metodo .ReadLine() legge una linea di testo dal flusso, come fa l'istruzione Line Input, e restituisce ovviamente una stringa. In questo caso il file va aperto con il consueto comando Open, ma non è necessario specificare la modalità di apertura del file.

Public Sub Button1_Click()

 Dim fl As File
 Dim s As String


  fl = Open "/percorso/del/file"

  While Not Eof(fl)
    s = fl.ReadLine()
    Print s;
  Wend

  fl.Close

End


Uso della proprietà .Lines della Classe Stream

Si potrà anche usare la proprietà .Lines della classe Stream.
In particolare la proprietà .Lines ritorna un oggetto virtuale che consente di distinguere un flusso di dati linea per linea.

Public Sub Main()

 Dim fl As File
 Dim s As String
 Dim t As Stream


  t = Open "/percorso/del/file"
 
  For Each s In t.Lines
    Print s
  Next

  t.Close

End