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 | 二進位模式,如果檔是二進位檔,可以加上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.lua 檔的第一行資訊,並在該檔最後一行添加了 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 值可以是:
- "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()
</pre>
<p>我這邊輸出的結果是:</p>
<pre>
st.lua 檔末尾--test