Lua 文件 I/O

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

  • 簡(jiǎn)單模式(simple model)擁有一個(gè)當(dāng)前輸入文件和一個(gè)當(dāng)前輸出文件,并且提供針對(duì)這些文件相關(guān)的操作。

  • 完全模式(complete model) 使用外部的文件句柄來(lái)實(shí)現(xiàn)。它以一種面對(duì)對(duì)象的形式,將所有的文件操作定義為文件句柄的方法

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

打開文件操作語(yǔ)句如下:

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

mode 的值有:

模式描述
r以只讀方式打開文件,該文件必須存在。
w打開只寫文件,若文件存在則文件長(zhǎng)度清為0,即該文件內(nèi)容會(huì)消失。若文件不存在則建立該文件。
a以附加的方式打開只寫文件。若文件不存在,則會(huì)建立該文件,如果文件存在,寫入的數(shù)據(jù)會(huì)被加到文件尾,即文件原先的內(nèi)容會(huì)被保留。(EOF符保留)
r+以可讀寫方式打開文件,該文件必須存在。
w+打開可讀寫文件,若文件存在則文件長(zhǎng)度清為零,即該文件內(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(如果沒(méi)有你需要?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.lua 文件的第一行信息,并在該文件最后一行添加了 lua 的注釋。如我這邊輸出的是:

-- test.lua 文件

在以上示例中我們使用了 io."x" 方法,其中 io.read() 中我們沒(méi)有帶參數(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 來(lái)代替 io.function_name 方法。以下示例演示了如何同時(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 值可以是:

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

    • "set": 從文件頭開始

    • "cur": 從當(dāng)前位置開始[默認(rèn)]

    • "end": 從文件尾開始

    • offset:默認(rèn)為0

  • 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

以下示例使用了 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
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清