Lua 文件 I/O
Lua I/O 庫用於讀取和處理檔案。分為簡單模式(和C一樣)、完全模式。
簡單模式(simple model)擁有一個當前輸入文件和一個當前輸出文件,並且提供針對這些文件相關的操作。
完全模式(complete model) 使用外部的檔案句柄來實作。它以一種面對物件的形式,將所有的檔案操作定義為檔案句柄的方法
#簡單模式在做一些簡單的檔案操作時較為合適。但是在進行一些進階的文件操作的時候,簡單模式就顯得力不從心。例如同時讀取多個檔案這樣的操作,使用完全模式則較為適當。
開啟檔案操作語句如下:
file = io.open (filename [, mode])
mode 的值有:
模式 | 說明 |
---|---|
r | 以唯讀方式開啟文件,該文件必須存在。 |
w | 開啟只寫文件,若文件存在則文件長度清除為0,即該文件內容會消失。若文件不存在則建立該文件。 |
a | 以附加的方式開啟只寫檔案。若文件不存在,則會建立該文件,如果文件存在,寫入的資料會被加到文件尾,即文件原先的內容會被保留。 (EOF符保留) |
r+ | 以可讀寫方式開啟文件,該文件必須存在。 |
w+ | 開啟可讀寫文件,若文件存在則文件長度清除為零,即該文件內容會消失。若文件不存在則建立該文件。 |
a+ | 與a類似,但此檔案可讀取可寫入 |
二進位模式,如果檔案是二進位文件,可以加上b | |
+ | 號表示對檔案既可以讀取也可以寫 |
簡單模式
簡單模式使用標準的 I/O 或使用一個目前輸入檔和一個目前輸出檔。
以下為file.lua 檔案程式碼,操作的檔案為test.lua(如果沒有你需要建立該檔案),程式碼如下:
-- 以只读方式打开文件 file = io.open("test.lua", "r") -- 设置默认输入文件为 test.lua io.input(file) -- 输出文件第一行 print(io.read()) -- 关闭打开的文件 io.close(file) -- 以附加的方式打开只写文件 file = io.open("test.lua", "a") -- 设置默认输出文件为 test.lua io.output(file) -- 在文件最后一行添加 Lua 注释 io.write("-- test.lua 文件末尾注释") -- 关闭打开的文件 io.close(file)
執行以上程式碼,你會發現,輸出了test.ua 檔案的第一行信息,並在該文件最後一行添加了lua 的註釋。如我這邊輸出的是:
-- test.lua 文件
在上述實例中我們使用了io."x" 方法,其中io.read() 中我們沒有帶參數,參數可以是下表中的一個:
模式 | 描述 |
---|---|
#"*n" | 讀取一個數字並返回它。範例:file.read("*n") |
"*a" | #從目前位置讀取整個檔案。範例:file.read("*a") |
"*l"(預設) | 讀取下一行,在檔案尾(EOF) 處傳回nil 。範例:file.read("*l") |
number | 傳回一個指定字元數的字串,或在 EOF 時傳回 nil。範例:file.read(5) |
其他的io 方法有:
io.tmpfile():傳回一個暫存檔案句柄,該檔案以更新模式打開,程式結束時會自動刪除
io.type(file): 偵測obj是否一個可用的檔案句柄
##io .flush(): 向文件寫入緩衝中的所有資料
#io.lines(optional file name): 傳回一個迭代函數,每次呼叫將獲得文件中的一行內容,當到文件尾時,將返回nil,但不關閉文件
#完全模式通常我們需要在同一時間處理多個文件。我們需要使用 file:function_name 來取代 io.function_name 方法。以下實例示範如同同時處理同一個檔案:
-- 以只读方式打开文件 file = io.open("test.lua", "r") -- 输出文件第一行 print(file:read()) -- 关闭打开的文件 file:close() -- 以附加的方式打开只写文件 file = io.open("test.lua", "a") -- 在文件最后一行添加 Lua 注释 file:write("--test") -- 关闭打开的文件 file:close()執行以上程式碼,你會發現,輸出了 test.ua 檔案的第一行訊息,並在該檔案最後一行新增了 lua 的註解。如我這邊輸出的是:
-- test.lua 文件read 的參數與簡單模式一致。 其他方法:
file:seek(optional whence, optional offset): 設定和取得目前檔案位置,成功則傳回最終的檔案位置(按位元組),失敗則傳回nil加錯誤訊息。參數whence 值可以是:
不帶參數file:seek()則傳回目前位置,file:seek("set")則定位到檔案頭,file:seek("end")則定位到文件尾並返回檔案大小- "set": 從檔案頭開始
- "cur": 從目前位置開始[預設]
- "end": 從檔案尾開始
- #offset:預設為0
- ##file:flush():
向檔案寫入緩衝中的所有資料
- io.lines(optional file name):
開啟指定的檔案filename為讀取模式並傳回一個迭代函數,每次呼叫將獲得檔案中的一行內容,當到檔案尾時,將傳回nil,並自動關閉檔案。 若不帶參數時io.lines() <=> io.input():lines(); 讀取預設輸入裝置的內容,但結束時不關閉檔案,如
for line in io.lines("main.lua") do print(line) end
以下實例使用了seek 方法,定位到檔案倒數第25 個位置並使用read 方法的*a 參數,即從當期位置(倒數第25 個位置)讀取整個檔案。
-- 以只读方式打开文件 file = io.open("test.lua", "r") file:seek("end",-25) print(file:read("*a")) -- 关闭打开的文件 file:close()
我這邊輸出的結果是:
st.lua 文件末尾--test