Lua檔案的I/O
在Lua裡面,讀取檔案分兩個模式:簡單模式 和 完全模式。
簡單模式:擁有當前一個讀入檔案和讀出檔案,在Lua I/O庫裡面提供相關的一些簡單的操作。
完全模式:使用檔案的控制代碼對檔案進行操作。
區別在於:簡單模式中對檔案的操作比較少,適合對單一的檔案做處理。如果我們同時對多個檔案進行處理的,就需要使用我們的完全模式。
開啟檔案的模式(mode)有很多種:
r | 以只讀方式開啟檔案,該檔案必須存在。 |
w | 開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。 |
a | 以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。(EOF符保留) |
r+ | 以可讀寫方式開啟檔案,該檔案必須存在。 |
w+ | 開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。 |
a+ | 與a類似,但此檔案可讀可寫 |
b | 二進位制模式,如果檔案是二進位制檔案,可以加上b |
+ | 號表示對檔案既可以讀也可以寫 |
Lua的 I/O裡面提供的介面大多都是兩個引數:第一個就是我們需要操作的檔案,第二個就是我們表中介紹的模式
簡單模式
現在我們在file.lua 裡面操作test.lua檔案
--注意test.lua檔案的路徑 --“./test.lua”表示當前路徑 --"../test.lua"表示當前路徑的上一級路徑 --因為我的.lua檔案放在Lua解析器的上一級目錄,所以我需要使用"../test.lua" --因為我們第一次開啟檔案的模式使用的是:'r',所以檔案必須存在,如果沒有我們需要自己提前建立 -- 以只讀方式開啟檔案 file = io.open("test.lua", "r") -- 設定預設輸入檔案為 test.lua io.input(file) --如果我們建立的檔案裡面沒有任何的內容,那就是:nil -- 輸出檔案第一行 print(io.read()) -- 關閉開啟的檔案 io.close(file) --'a'模式開啟檔案,如果沒有檔案則會建立,如果有,那麼寫入資料就會在檔案的末尾 -- 以附加的方式開啟只寫檔案 file = io.open("test.lua", "a") -- 設定預設輸出檔案為 test.lua io.output(file) -- 在檔案最後一行新增 Lua 註釋 io.write("-- test.lua 檔案末尾註釋") -- 關閉開啟的檔案 io.close(file)
注意:函式io.raed()沒有帶引數,這個函式的引數介紹如下:
" *n " | 讀取一個數字並返回它。例:file.read("*n") |
" *a " | 從當前位置讀取整個檔案。例:file.read("*a") |
" *l "(預設) | 讀取下一行,在檔案尾 (EOF) 處返回 nil。例:file.read("*l") |
number | 返回一個指定字元個數的字串,或在 EOF 時返回 nil。例:file.read(5) |
當我們執行完上面的程式碼,就可以開啟test.lua檔案看一下,裡面就會有:“-- test.lua 檔案末尾註釋”這句話。
上面介紹的是比較常用的幾個IO,還有幾個IO介紹如下:
① io.tmpfile():返回一個臨時檔案控制代碼,該檔案以更新模式開啟,程式結束時自動刪除
② io.type(file): 檢測obj是否一個可用的檔案控制代碼
③ io.flush(): 向檔案寫入緩衝中的所有資料
④ io.lines(optional file name): 返回一個迭代函式,每次呼叫將獲得檔案中的一行內容,當到檔案尾時,將返回nil,但不關閉檔案
完全模式
當我們需要同時對多個檔案進行處理,就需要用到我們的完全模式。
程式碼的區別就是:一個使用io去呼叫介面,一個是使用檔案控制代碼去呼叫介面,使用io的話就只能操作一個檔案了,使用控制代碼的話就可以操作多個檔案了,誰的控制代碼去掉用介面,就會去操作哪個檔案。
--首先要注意的地方和之前簡單模式一樣就是"test.lua"檔案的路徑,其次就是第一次開啟"test.lua"檔案的模式,要注意是自己建立還是程式幫忙建立
-- 以只讀方式開啟檔案
file = io.open("../test.lua", "r")
--file.read()的引數還是沒有選擇,這裡面的引數和之前簡單模式的引數一樣,參考之前給出的read介面引數的表格就行
-- 輸出檔案第一行
print(file:read())
-- 關閉開啟的檔案
file:close()
-- 以附加的方式開啟只寫檔案
file = io.open("../test.lua", "a")
-- 在檔案最後一行新增 Lua 註釋
file:write("--test")
-- 關閉開啟的檔案
file:close()
執行完上面的程式碼,在test.lua檔案裡面就可以看到:"-- test.lua 檔案末尾註釋"這句話了。
其他方法:
①:file:seek(optional whence, optional offset): 設定和獲取當前檔案位置,成功則返回最終的檔案位置(按位元組),失敗則返回nil加錯誤資訊。引數 whence 值可以是:
"set": 從檔案頭開始
"cur": 從當前位置開始[預設]
"end": 從檔案尾開始
offset:預設為0
不帶引數file:seek()則返回當前位置,file:seek("set")則定位到檔案頭,file:seek("end")則定位到檔案尾並返回檔案大小
②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