1. 程式人生 > >Lua檔案的I/O

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