Vorrei che in un programma, se io apro una file, mi legge le righe del file e per ogni riga faccia una funzione.
Non si capisce chi abbia scritto il file a cui ti riferisci. É un file .txt di Linux?
Se si, è buona norma che ciascuna riga finisca sempre con una sequenza di escape. In Gambas, qualora la riga in registrazione non contenga un punto e virgola, né una virgola (\t(X09)) dopo l'ultima espressione, un end-of-line (\n(X0A)) verrà aggiunto automaticamente.
Alla luce di quanto indicato nella documentazione di Gambas, io registro i miei file sequenziali con la seguente modalità:
hFile = Open $FlSeq For Output
For i = 0 To iTotRec
Print #hFile, campo[i, 0], campo[i, 1], campo3[i, 2], vTabMovvCanc[i, 3]
Next
Close #hFile
mentre in lettura uso:
Dim hFile As File ' File dei movimenti anomali già cancellati nelle giornate contabili di appartenenza
Dim hRec As String ' Area di lettura dei record di hFile
Dim $FlSeq As String
Dim vTabRec As New Variant[]
'-----------------------------------------------------------------------------------------------------------------
hFile = Open $FlSeq For Input
While Not Eof(hFile)
Line Input #hFile, hRec
vTabRec.Add(hRec)
Wend
Riesco a leggere una riga alla volta con la massima semplicità. :D
Il carattere di fine linea può essere impostato con la proprietà Stream.EndOfLine. di conseguenza la funzione Line Input troncherà la linea quando incontra tale sequenza.
Quella proprietà penso che vada settata prima di usare Line Input, magari, come dice Sotema, controllando il file subito dopo l'apertura.
Effettivamente, contrariamente a come supponevo, la proprietà .EndOfLine va impostata con la costante coerente con il tipo di codifica del fine-riga contenuto dal file di testo.
Dunque, la proprietà .EndOfLine della variabile di tipo File non è in grado di dirci a priori quale sia il tipo di carattere di fine-riga; ci può dire - invece - il tipo da noi impostato per far troncare ciascuna linea presente nel file di testo in modo coerente con la codifica.
Poniamo il caso di avere un file di testo, la cui rappresentazione esadecimale è la seguente:
46 6F 72 75 6D 20 64 69 0D 47 61 6D 61 62 73 0D
Da notare i due valori di fine-riga 0x0D, quindi appartenenti alla codifica Mac.
Leggiamo quel file di testo con il seguente codice Gambas:
Public Sub Main()
Dim s As String
Dim fl As File
fl = Open "/percorso/del/file/di/testo" For Input
' Sapendo a priori che la codifica del file di testo è quella del Mac,
' impostiamo la proprietà ".EndOfLine" in modo coerente:
fl.EndOfLine = gb.Mac
While Not Eof(fl)
Line Input #fl, s
Print s
Wend
fl.Close
End
oppure con la proprietà .Lines:
Public Sub Main()
Dim s As String
Dim fl As File
fl = Open "/percorso/del/file/di/testo" For Input
fl.EndOfLine = gb.Mac
For Each s In fl.Lines
Print s
Next
fl.Close
End
o anche con il metodo .ReadLine:
Public Sub Main()
Dim s As String
Dim fl As File
fl = Open "/percorso/del/file/di/testo" For Input
fl.EndOfLine = gb.Mac
While Not Eof(fl)
s = fl.ReadLine()
Print s
Wend
fl.Close
End
.....qualora non si intenda utilizzare la risorsa Open...For Input, ma si preferisca la Classe File, si potrà ovviamente fare così con la funzione Split():
Public Sub Main()
Dim s As String
s = File.Load("/percorso/del/file/di/testo/codificato/in/Mac")
For Each s In Split(s, "\x0D")
Print s
Next
End
oppure con la funzione Scan():
Public Sub Main()
Dim s As String
s = File.Load("/percorso/del/file/di/testo/codificato/in/Mac")
For Each s In Scan(s, "*\x0D*")
Print s
Next
End