Differenze tra le versioni di "Leggere un file di testo"

Da Gambas-it.org - Wikipedia.
 
Riga 3: Riga 3:
 
===Con il metodo ''File.Load''===
 
===Con il metodo ''File.Load''===
 
L'uso del Metodo ".Load( )" della Classe ''File'' è certamente il modo più semplice per leggere un file di testo.
 
L'uso del Metodo ".Load( )" della Classe ''File'' è certamente il modo più semplice per leggere un file di testo.
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   Dim s As String
 
   Dim s As String
 
   
 
   
  s = File.<FONT color=#B222222>Load</font>("''/percorso/del/file/di/testo''")
+
  s = File.<FONT color=#B222222>Load</font>("<FONT color=darkgreen>''/percorso/del/file/di/testo''</font>")
 
   
 
   
  '''End'''
+
  End
  
  
 
===Con "''Open....For Read/Input''" e "''Line Input''"===
 
===Con "''Open....For Read/Input''" e "''Line Input''"===
  '''Public''' Sub Button1_Click()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl As File   
 
   Dim fl As File   
   Dim s$ As String  
+
   Dim s As String  
 
    
 
    
+
  fl = Open "<FONT color=darkgreen>''/percorso/del/file/di/testo''</font>" For Read  <FONT color=#006400>' ''...oppure "Input"''</font>
  fl = Open "''/percorso/del/file/di/testo''" For Read  <FONT color=#006400>' ''...oppure "Input"''</font>
 
 
    
 
    
 
  <FONT color=gray>' ''Compie il ciclo fin tanto che non è giunto alla fine del file:''</font>
 
  <FONT color=gray>' ''Compie il ciclo fin tanto che non è giunto alla fine del file:''</font>
  While Not Eof(fl)
+
  While Not Eof(fl)
 
  <FONT color=gray>' ''"Line Input" legge le stringhe in un File di testo fino al carattere di "nuova linea a capo":''</font>
 
  <FONT color=gray>' ''"Line Input" legge le stringhe in un File di testo fino al carattere di "nuova linea a capo":''</font>
    Line Input #fl, s$
+
    Line Input #fl, s
  <FONT color=gray>' ''Mostra il contenuto della variabile s$ in una "TextArea":''</font>
+
  <FONT color=gray>' ''Mostra il contenuto della variabile s:''</font>
      TextArea1.Text = TextArea1.Text & s$ & "\n"
+
    Print s
  Wend
+
  Wend
 
   
 
   
  fl.Close
+
  fl.Close
 
   
 
   
  '''End'''
+
  End
  
  
Riga 42: Riga 41:
 
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''".
 
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.
 
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()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl As File   
 
   Dim fl As File   
   Dim s$ As String  
+
   Dim s As String  
 
    
 
    
+
  fl = Open "<FONT color=darkgreen>''/percorso/del/file/di/testo''</font>" For Read  <FONT color=gray>' ''...oppure "Input"''</font>
  fl = Open "''/percorso/del/file/di/testo''" For Read  <FONT color=gray>' ''...oppure "Input"''</font>
 
 
   
 
   
 
   While Not Eof(fl)
 
   While Not Eof(fl)
     Read #fl, s$, <FONT color=#B22222>-256</font>
+
     Read #fl, s, <FONT color=#B22222>-256</font>
  <FONT color=gray>' ''Mostra il contenuto della variabile s$ in una "TextArea":''</font>
+
  <FONT color=gray>' ''Mostra il contenuto della variabile s:''</font>
     TextArea1.Text = TextArea1.Text & s$ & "\n"
+
     Print s
  Wend
+
  Wend
 
    
 
    
  fl.Close
+
  fl.Close
 
   
 
   
  '''End'''
+
End
  
  
 
===Con "''Open....For Read/Input''" e "''Read......, '''Lof'''()''"===
 
===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:
 
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()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl As File   
 
   Dim fl As File   
   Dim s$ As String  
+
   Dim s As String
 
 
 
   
 
   
  fl = Open "''/percorso/del/file/di/testo''" For Read  <FONT color=#006400>' ''...oppure "Input"''</font>
+
  fl = Open "<FONT color=darkgreen>''/percorso/del/file/di/testo''</font>" For Read  <FONT color=#006400>' ''...oppure "Input"''</font>
 
   
 
   
    Read #fl, s$, <FONT color=#B22222>Lof(fl)</font>
+
  Read #fl, s, <FONT color=#B22222>Lof(fl)</font>
 
   
 
   
    Print s$
+
  Print s
 
    
 
    
    fl.Close
+
  fl.Close
 
   
 
   
  '''End'''
+
  End
  
  
 
===Con "''Open....For Read''" e "''Stat().Size''"===
 
===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()''.
+
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()".
 
<BR>Tale proprietà ritorna la dimensione di un file.
 
<BR>Tale proprietà ritorna la dimensione di un file.
  '''Public''' Sub Button1_Click()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl As File   
 
   Dim fl As File   
 
   Dim s As String
 
   Dim s As String
 
 
 
   
 
   
  fl = Open "''/percorso/del/file/di/testo''" For Read
+
  fl = Open "<FONT color=darkgreen>''/percorso/del/file/di/testo''</font>" For Read
 
   
 
   
    Read #fl, s$, <FONT color=#B22222>Stat("</font>''/percorso/del/file/di/testo''<FONT color=#B22222>").Size</font>
+
  Read #fl, s$, <FONT color=#B22222>Stat("</font>''/percorso/del/file/di/testo''<FONT color=#B22222>").Size</font>
 
   
 
   
    Print s
+
  Print s
 
    
 
    
    fl.Close
+
  fl.Close
 
   
 
   
  '''End'''
+
  End
 
 
 
 
 
Se si vuole utilizzare un ciclo ''While...Wend'' e leggere un byte per volta da convertire in carattere ASCII, si potrà scrivere così:
 
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()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
Riga 107: Riga 101:
 
   Dim s As String
 
   Dim s As String
 
   
 
   
+
  s = "<FONT color=darkgreen>''/percorso/del/file/di/testo''</font>"
  s = "''/percorso/del/file/di/testo''"
 
 
    
 
    
  fl = Open s For Read
+
  fl = Open s For Read
 
   
 
   
  While Seek(fl) < Stat(s).Size  <FONT color=gray>' '''ma anche più semplicemente con: Not Eof(Fl)''</font>
+
  While Seek(fl) < Stat(s).Size  <FONT color=gray>' '''ma anche più semplicemente con: Not Eof(Fl)''</font>
    Read #fl, b
+
    Read #fl, b
    Print Chr(b);
+
    Print Chr(b);
  Wend
+
  Wend
 
   
 
   
  '''End'''
+
  End
  
  
 
===Con "''Open....For Read/Input''" e "''Input''"===
 
===Con "''Open....For Read/Input''" e "''Input''"===
  '''Public''' Sub Button1_Click()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl As File   
 
   Dim fl As File   
   Dim s$ As String
+
   Dim s As String
   Dim ss$ As New String[]
+
   Dim ss As New String[]
   Dim j As Byte
+
   Dim b As Byte
 
   
 
   
 +
  fl = Open "<FONT color=darkgreen>''/percorso/del/file/di/testo''</font>" For Read  <FONT color=gray>' ''...oppure "Input"''</font>
 
   
 
   
  fl = Open "''/percorso/del/file/di/testo''" For Read   <FONT color=gray>' ''...oppure "Input"''</font>
+
   While Not Eof(fl)
+
    Input #fl, s
+
  <FONT color=gray>' ''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:''</font>
While Not Eof(fl)
+
    ss.Push(s)
  Input #fl, s$
 
  <FONT color=gray>' ''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$:''</font>
 
  ss$.Add(s$)
 
 
   Wend
 
   Wend
 
    
 
    
  Close #fl
+
  Close #fl
 
   
 
   
  <FONT color=gray>' ''Mostra in una "TextArea" ogni stringa contenuta in ciascun elemento della variabile-array ss$:''</font>
+
  <FONT color=gray>' ''Mostra ogni stringa contenuta in ciascun elemento della variabile-array ss:''</font>
  For j = 0 To ss$.Max
+
  For b = 0 To ss.Max
     TextArea1.Text = TextArea1.Text & ss$[j] & "\n"
+
     Print ss[b]
  Next
+
  Next
 
+
  '''End'''
+
  End
  
  
===Uso del metodo ''.ReadLine()'' della Classe ''Stream''===
+
===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.
 
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()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
 
   Dim s As String
 
   Dim s As String
 
   
 
   
 +
  fl = Open "<FONT color=darkgreen>''/percorso/del/file/di/testo''</font>"
 
   
 
   
  fl = Open "''/percorso/del/file''"
+
  While Not Eof(fl)
+
    s = fl<FONT color=#B22222>.ReadLine()</font>
  While Not Eof(fl)
+
    Print s;
    s = fl<FONT color=#B22222>.ReadLine()</font>
+
  Wend
    Print s;
 
  Wend
 
 
   
 
   
  fl.Close
+
  fl.Close
 
   
 
   
  '''End'''
+
  End
  
  
===Uso della proprietà ''.Lines'' della Classe ''Stream''===
+
===Uso della Proprietà ".Lines" della Classe ''Stream''===
Si potrà anche usare la proprietà ''.Lines'' della classe ''Stream''.
+
Si potrà anche usare la Proprietà ".Lines" della classe ''Stream''.
<BR>In particolare la proprietà ''.Lines'' ritorna un oggetto virtuale che consente di distinguere un flusso di dati linea per linea.
+
<BR>In particolare la Proprietà ".Lines" ritorna un oggetto virtuale che consente di distinguere un flusso di dati linea per linea.
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
Riga 178: Riga 167:
 
   Dim t As Stream
 
   Dim t As Stream
 
   
 
   
 +
  t = Open "<FONT color=darkgreen>''/percorso/del/file/di/testo''</font>"
 
   
 
   
  t = Open "''/percorso/del/file''"
+
   For Each s In <FONT color=#B22222>t.Lines</font>
    
+
    Print s
  For Each s In <FONT color=#B22222>t.Lines</font>
+
  Next
    Print s
 
  Next
 
 
   
 
   
  t.Close
+
  t.Close
 
   
 
   
  '''End'''
+
  End

Versione attuale delle 14:29, 18 mar 2024

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