Lua 文件 I/O

Lua 文件 I/O

  • 作者:楊夢(mèng)鴿
  • 校對(duì):翟舒青

Lua I/O 庫用于讀取和處理文件。分為簡(jiǎn)單模式(和C一樣)、完全模式。

  • 簡(jiǎn)單模式(simple model)擁有一個(gè)當(dāng)前輸入文件和一個(gè)當(dāng)前輸出文件,并且提供針對(duì)這些文件相關(guān)的操作。
  • 完全模式(complete model) 使用外部的文件句柄來實(shí)現(xiàn)。它以一種面對(duì)對(duì)象的形式,將所有的文件操作定義為文件句柄的方法

簡(jiǎn)單模式在做一些簡(jiǎn)單的文件操作時(shí)較為合適。但是在進(jìn)行一些高級(jí)的文件操作的時(shí)候,簡(jiǎn)單模式就顯得力不從心。例如同時(shí)讀取多個(gè)文件這樣的操作,使用完全模式則較為合適。

打開文件操作語句如下:

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

mode 的值有:

模式 描述
r 以只讀方式打開文件,該文件必須存在。
w 打開只寫文件,若文件存在則文件長度清為0,即該文件內(nèi)容會(huì)消失。若文件不存在則建立該文件。
a 以附加的方式打開只寫文件。若文件不存在,則會(huì)建立該文件,如果文件存在,寫入的數(shù)據(jù)會(huì)被加到文件尾,即文件原先的內(nèi)容會(huì)被保留。(EOF符保留)
r+ 以可讀寫方式打開文件,該文件必須存在。
w+ 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內(nèi)容會(huì)消失。若文件不存在則建立該文件。
a+ 與a類似,但此文件可讀可寫
b 二進(jìn)制模式,如果文件是二進(jìn)制文件,可以加上b
+ 號(hào)表示對(duì)文件既可以讀也可以寫

簡(jiǎn)單模式

簡(jiǎn)單模式使用標(biāo)準(zhǔn)的 I/O 或使用一個(gè)當(dāng)前輸入文件和一個(gè)當(dāng)前輸出文件。

以下為 file.lua 文件代碼,操作的文件為test.lua(如果沒有你需要?jiǎng)?chuàng)建該文件),代碼如下:

-- 以只讀方式打開文件
file = io.open("test.lua", "r")

-- 設(shè)置默認(rèn)輸入文件為 test.lua
io.input(file)

-- 輸出文件第一行
print(io.read())

-- 關(guān)閉打開的文件
io.close(file)

-- 以附加的方式打開只寫文件
file = io.open("test.lua", "a")

-- 設(shè)置默認(rèn)輸出文件為 test.lua
io.output(file)

-- 在文件最后一行添加 Lua 注釋
io.write("--  test.lua 文件末尾注釋")

-- 關(guān)閉打開的文件
io.close(file)

執(zhí)行以上代碼,你會(huì)發(fā)現(xiàn),輸出了 test.ua 文件的第一行信息,并在該文件最后一行添加了 lua 的注釋。如我這邊輸出的是:

-- test.lua 文件

在以上實(shí)例中我們使用了 io."x" 方法,其中 io.read() 中我們沒有帶參數(shù),參數(shù)可以是下表中的一個(gè):

模式 描述
"*n" 讀取一個(gè)數(shù)字并返回它。例:file.read("*n")
"*a" 從當(dāng)前位置讀取整個(gè)文件。例:file.read("*a")
"*l"(默認(rèn)) 讀取下一行,在文件尾 (EOF) 處返回 nil。例:file.read("*l")
number 返回一個(gè)指定字符個(gè)數(shù)的字符串,或在 EOF 時(shí)返回 nil。例:file.read(5)

其他的 io 方法有:

  • io.tmpfile():返回一個(gè)臨時(shí)文件句柄,該文件以更新模式打開,程序結(jié)束時(shí)自動(dòng)刪除
  • io.type(file): 檢測(cè)obj是否一個(gè)可用的文件句柄
  • io.flush(): 向文件寫入緩沖中的所有數(shù)據(jù)
  • io.lines(optional file name): 返回一個(gè)迭代函數(shù),每次調(diào)用將獲得文件中的一行內(nèi)容,當(dāng)?shù)轿募矔r(shí),將返回nil,但不關(guān)閉文件

完全模式

通常我們需要在同一時(shí)間處理多個(gè)文件。我們需要使用 file:function_name 來代替 io.function_name 方法。以下實(shí)例演示了如何同時(shí)處理同一個(gè)文件:

-- 以只讀方式打開文件
file = io.open("test.lua", "r")

-- 輸出文件第一行
print(file:read())

-- 關(guān)閉打開的文件
file:close()

-- 以附加的方式打開只寫文件
file = io.open("test.lua", "a")

-- 在文件最后一行添加 Lua 注釋
file:write("--test")

-- 關(guān)閉打開的文件
file:close()

執(zhí)行以上代碼,你會(huì)發(fā)現(xiàn),輸出了 test.ua 文件的第一行信息,并在該文件最后一行添加了 lua 的注釋。如我這邊輸出的是:

-- test.lua 文件

read 的參數(shù)與簡(jiǎn)單模式一致。

其他方法:

  • file:seek(optional whence, optional offset): 設(shè)置和獲取當(dāng)前文件位置,成功則返回最終的文件位置(按字節(jié)),失敗則返回nil加錯(cuò)誤信息。參數(shù) whence 值可以是:

    • "set": 從文件頭開始
    • "cur": 從當(dāng)前位置開始[默認(rèn)]
    • "end": 從文件尾開始
    • offset:默認(rèn)為0

    不帶參數(shù)file:seek()則返回當(dāng)前位置,file:seek("set")則定位到文件頭,file:seek("end")則定位到文件尾并返回文件大小

  • file:flush(): 向文件寫入緩沖中的所有數(shù)據(jù)

  • io.lines(optional file name): 打開指定的文件filename為讀模式并返回一個(gè)迭代函數(shù),每次調(diào)用將獲得文件中的一行內(nèi)容,當(dāng)?shù)轿募矔r(shí),將返回nil,并自動(dòng)關(guān)閉文件。
    若不帶參數(shù)時(shí)io.lines() <=> io.input():lines(); 讀取默認(rèn)輸入設(shè)備的內(nèi)容,但結(jié)束時(shí)不關(guān)閉文件,如

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

以下實(shí)例使用了 seek 方法,定位到文件倒數(shù)第 25 個(gè)位置并使用 read 方法的 *a 參數(shù),即從當(dāng)期位置(倒數(shù)第 25 個(gè)位置)讀取整個(gè)文件。

-- 以只讀方式打開文件
file = io.open("test.lua", "r")

file:seek("end",-25)
print(file:read("*a"))

-- 關(guān)閉打開的文件
file:close()

我這邊輸出的結(jié)果是:

st.lua 文件末尾--test
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,256評(píng)論 0 38
  • Lua I/O 庫用于讀取和處理文件。分為簡(jiǎn)單模式(和C一樣)、完全模式。 簡(jiǎn)單模式(simple model)擁...
    誰說我是小小云閱讀 737評(píng)論 0 0
  • I/O 庫提供了兩套不同風(fēng)格的文件處理接口。 第一種風(fēng)格使用隱式的文件句柄; 它提供設(shè)置默認(rèn)輸入文件及默認(rèn)輸出文件...
    chiguozi閱讀 6,776評(píng)論 1 4
  • 今天參加了交通大學(xué)朱輝榮教授的線上的《21天成為講故事的高手》周PK賽!一共4隊(duì),每組3人,分組對(duì)決,相互給對(duì)方出...
    子陵688閱讀 249評(píng)論 0 2
  • 在社群中,大家都在討論《寫了一百萬行代碼是什么體驗(yàn)》,小編覺得這是一個(gè)偽命題,首先假設(shè)平均一天100行高質(zhì)量代碼,...
    碼農(nóng)星球閱讀 554評(píng)論 1 0

友情鏈接更多精彩內(nèi)容