Differenze tra le versioni di "Leggere un file di testo"
(Creata pagina con '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 ap...') |
|||
Riga 96: | Riga 96: | ||
fl.Close | 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 <FONT color=gray>' '''ma anche più semplicemente con: Not Eof(Fl)''</font> | ||
+ | Read #fl, b | ||
+ | Print Chr(b); | ||
+ | Wend | ||
'''End''' | '''End''' |
Versione delle 08:37, 17 gen 2014
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.
Indice
- 1 Con il metodo File.Load
- 2 Con "Open....For Read/Input" e "Line Input"
- 3 Con "Open....For Read/Input" e "Read", -256
- 4 Con "Open....For Read/Input" e "Read......, Lof()"
- 5 Con "Open....For Read" e "Stat().Size"
- 6 Con "Open....For Read/Input" e "Input"
- 7 Uso del metodo .ReadLine() della Classe Stream
- 8 Uso della proprietà .Lines della Classe Stream
Con il metodo File.Load
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