English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

I/O 文件 Lua

La libreria I/O di Lua è utilizzata per leggere e elaborare i file. È divisa in modalità semplice (come C) e modalità completa.

  • La modalità semplice (simple model) ha un file di input e un file di output corrente, e fornisce operazioni correlate per questi file.

  • Il modello completo (complete model) utilizza il file handle esterno per implementare. In una forma orientata agli oggetti, tutte le operazioni di file vengono definite come metodi del file handle

La modalità semplice è adatta per alcune operazioni di file semplici. Ma quando si eseguono operazioni di file avanzate, la modalità semplice sembra non essere sufficiente. Ad esempio, leggere contemporaneamente più file, utilizzare il modello completo è più adatto.

L'operazione di apertura del file è la seguente:

file = io.open (filename[, mode])

I valori di mode sono:

ModalitàDescrizione
rApri un file in sola lettura, il file deve esistere.
wApri un file scrivibile, se il file esiste, la lunghezza del file viene azzerata, il che significa che il contenuto del file sarà perso. Se il file non esiste, verrà creato il file.
aApri un file scrivibile in modo aggiuntivo. Se il file non esiste, verrà creato il file. Se il file esiste, i dati scritti verranno aggiunti alla fine del file, il che significa che il contenuto del file precedente sarà conservato (EOF conservato).
r+Apri un file leggibile e scrivibile, il file deve esistere.
w+Apri un file leggibile e scrivibile, se il file esiste, la lunghezza del file viene azzerata, il che significa che il contenuto del file sarà perso. Se il file non esiste, verrà creato il file.
a+Simile a a, ma questo file è leggibile e scrivibile
bModalità binaria, se il file è un file binario, puoi aggiungere b
+Il simbolo # indica che il file può essere letto e scritto.

Modalità semplice

La modalità semplice utilizza lo standard I/O o un file di input e output corrente.

Ecco il codice del file file.lua, il file operato è test.lua (se non esiste, dovrai crearlo), il codice è il seguente:

-- Apre il file in modalità sola lettura
file = io.open("test.lua", "r")
-- Imposta il file di input predefinito su test.lua
io.input(file)
-- Output del primo riga del file
print(io.read())
-- Chiude il file aperto
io.close(file)
-- Apri un file di scrittura in modalità aggiunta
file = io.open("test.lua", "a")
-- Imposta il file di output predefinito su test.lua
io.output(file)
-- Aggiungi una nota a piè di pagina Lua all'ultima riga del file
io.write("--  test.lua note alla fine del file")
-- Chiude il file aperto
io.close(file)

Eseguendo il codice sopra, noterai che è stato outputto il primo riga del file test.lua e una nota a piè di pagina Lua è stata aggiunta all'ultima riga del file. Come nella mia uscita:

-- file: test.lua

Nell'esempio sopra abbiamo usato il metodo io."x" dove io.read() non ha parametri, i parametri possono essere uno dei seguenti:

ModalitàDescrizione
"*n"Legge un numero e lo restituisce. Esempio: file.read("*n")
"*a"Legge tutto il file dalla posizione corrente. Esempio: file.read("*a")
"*l" (predefinito)Legge la prossima riga, restituisce nil alla fine del file (EOF). Esempio: file.read("*l")
numberRestituisce una stringa di una determinata lunghezza o nil alla fine del file (EOF). Esempio: file.read(5)

Altri metodi io:

  • io.tmpfile():Restituisce un file descriptor temporaneo, il file è aperto in modalità di aggiornamento e viene eliminato automaticamente alla fine del programma

  • io.type(file): Controlla se obj è un file descriptor disponibile

  • io.flush(): Scrive tutti i dati in buffer nel file

  • io.lines(nome file opzionale): Restituisce una funzione iterativa, che restituisce una riga del file ad ogni chiamata. Quando si raggiunge la fine del file, restituisce nil, ma non chiude il file

Modalità completa

Di solito dobbiamo gestire più file allo stesso tempo. Dobbiamo usare file:function_name al posto di io:function_name metodo. Esempio: come gestire lo stesso file contemporaneamente:

-- Apre il file in modalità sola lettura
file = io.open("test.lua", "r")
-- Output del primo riga del file
print(file:read())
-- Chiude il file aperto
file:close()
-- Apri un file di scrittura in modalità aggiunta
file = io.open("test.lua", "a")
-- Aggiungi una nota a piè di pagina Lua all'ultima riga del file
file:write("--test")
-- Chiude il file aperto
file:close()

Eseguendo il codice sopra, noterai che è stato outputto il primo riga del file test.ua e una nota a piè di pagina Lua è stata aggiunta all'ultima riga del file. Come nella mia uscita:

-- file: test.lua

I parametri di read sono gli stessi del modello semplice.

Altre metodi:

  • file:seek(opzionale whence, opzionale offset): Imposta e ottieni la posizione corrente del file, se ha successo restituisce la posizione finale del file (in byte), se fallisce restituisce nil con un messaggio di errore. Il valore del parametro whence può essere:

    Senza parametri file:seek() restituisce la posizione corrente, file:seek("set") posiziona all'inizio del file, file:seek("end") posiziona alla fine del file e restituisce la dimensione del file

    • "set": dall'inizio del file

    • "cur": dalla posizione corrente [predefinito]

    • "end": dal fondo del file

    • offset: di default è 0

  • file:flush(): Scrive tutti i dati in buffer nel file

  • io.lines(nome file opzionale): Apre il file specificato filename in modalità di lettura e restituisce una funzione iterativa, che restituisce una riga del file ogni volta che viene chiamata, quando si raggiunge la fine del file, restituisce nil e chiude automaticamente il file.
    Quando non viene specificato un parametro, io.lines() io.input():lines(); legge il contenuto del dispositivo di input predefinito, ma non chiude il file, come ad esempio:

    for line in io.lines("main.lua") do
      print(line)
      end

Esempio in cui viene utilizzato il metodo seek per posizionarsi all'ultima posizione del file in decimo quinto e utilizzare il parametro *a del metodo read, ovvero leggere l'intero file dalla posizione corrente (decimo quinto)

-- Apre il file in modalità sola lettura
file = io.open("test.lua", "r")
file:seek("end",-25)
print(file:read("*a"))
-- Chiude il file aperto
file:close()

Il risultato che ottengo è:

st.lua fine del file--test