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 Main()

 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:
   Print s
 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 Main()

 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:
   Print s
 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 Main()

 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 Classe "Stat()".
Tale proprietà ritorna la dimensione di un file.

Public Sub Main()

 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 Main()

 Dim fl As File  
 Dim s As String
 Dim ss As New String[]
 Dim b 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.Push(s)
 Wend
 
 Close #fl

' Mostra ogni stringa contenuta in ciascun elemento della variabile-array ss:
 For b = 0 To ss.Max
    Print ss[b]
 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 Main()

 Dim fl As File
 Dim s As String

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

 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/di/testo"

 For Each s In t.Lines
   Print s
 Next

 t.Close

End