Gianluigi ha esaurientemente risposto sull'argomento, e tanto basterebbe; ma per mera curiosità mostriamo a coloro, che si affacciano or ora a Gambas, altre modalità di lettura dell'ultima riga di un file di testo.
Un file cosiddetto "di testo" ha la particolarità di essere costituito non solo da caratteri ASCII stampabili (ossia che non sono caratteri di
controllo), ma anche di avere - al fine di consentire la visualizzazione delle righe l'una sotto l'altra - uno speciale carattere
escape corrispondente al codice ASCII
0x0A (in Gambas:
&h0A, o più semplicemente
&0A), che è anche conosciuto ed utilizzato all'interno di una stringa come:
\n.
Tale carattere
escape, significante
fine riga ed a capo, può dunque essere considerato un punto di riferimento fermo, certo, una sorta di faro per il programmatore all'interno del file di testo.
Quelle che
per noi sono le classiche righe di un testo, nel file sono definite e distinte dal byte di valore 10 (0x0A).
Va evidenziato, inoltre, che il file di testo termina con carattere escape \n. Dunque l'ultimo byte di un file di testo ha sempre valore &0A.
Alla luce di quanto detto ben si comprende che i dati dell'ultima riga iniziano immediatamente dopo il penultimo byte di valore 0x0A (&0A), posto alla fine dei byte costituenti la penultima riga, e termina con uguale carattere escape \n.
Pertanto sono questi due utlimi caratteri "faro" che noi dovremo tenere in dovuta considerazione e cercare.
Detto ciò vediamo alcune modalità per individuare e raccogliere i byte dell'ultima riga di un file di testo.
1) con
Line Input:
il comando
Line Input legge i dati di un file di testo in blocchi definiti appunto dai byte di valore 0x0A (&0A in linguaggio Gambas). Ne consegue che l'ultima lettura corrisponde all'ultima riga !
Public Sub Main()
Dim fl As File
Dim s As String
fl = Open "/percorso/del/file/di/testo" For Read
While Not Eof(fl)
Line Input #fl, s
' Se sono giunto alla fine del file, allora mostro la riga...che sarà ovviamente l'ultima:
If Eof(fl) Then Print s
Wend
End
2) con la proprietà
.Lines di un file:
la proprietà
.Lines, appartenente alle variabili di tipo File e Stream, si comporta sostanzialmente come la linea di comando
Line Input precedentemente vista.
Pertanto potremo avere questo codice:
Public Sub Main()
Dim fl As File
Dim s As String
fl = Open "/percorso/del/file/di/testo" For Read
For Each s In fl.Lines
Next
' L'ultima lettura contiene i dati dell'ultima riga del file di testo:
Print s
End
3) con la funzione
RInstr() ed altre funzioni stringa:
Come è noto, la funzione
RInstr( ) di Gambas restituisce la posizione dell'ultimo carattere, indicato nel suo secondo paramentro, all'interno della stringa
Poiché sappiamo che l'ultima riga inizia immediamente dopo l'ultimo carattere escape \n del file di testo e termina con un altro carattere escape \n ...
Public Sub Main()
Dim s As String
Dim i As Integer
s = File.Load("/percorso/del/file/di/testo")
' Elimino l'ultimo carattere escape \n dell'intero testo:
s = Scan(s, "*\n")[0]
' ...ma potrei utilizzare anche questa riga:
'' s = Left(s, Len(s) - 1)
' Individuo la posizione dell'attuale ultimo carattere escape \n (che in origine era il penultimo):
i = RInstr(s, "\n")
' Non mi resta altro che leggere i dati contenuti dall'ultimo dato a ritroso sino al dato
' posto immediatamente dopo il numero della posizione dell'ultimo carattere escape \n:
s = Right(s, Len(s) - i)
Print s
End
4) con le funzioni stringa
InStr() e
Mid()Public Sub Main()
Dim s As String
Dim i, r As Integer
Dim ii As New Integer[]
s = File.Load("/percorso/del/file/di/testo")
i = 1
' Carico tutte le occorrenze di \n:
Do
i = InStr(s, "\n", i)
If i > 0 Then
ii.Push(i)
Inc i
Inc r
Endif
Loop Until i = 0
s = Mid(s, ii[ii.Max - 1] + 1, (ii[ii.Max] - ii[ii.Max - 1]) - 1)
Print s
End
......e così via.