Io 函式庫教學

lua-users home
wiki

輸入和輸出設施

I/O 函式庫提供兩種不同的檔案處理樣式。第一個樣式使用非明示的文件描述符,也就是說有操作可以設定預設輸入檔案和預設輸出檔案,而且所有的輸入/輸出操作都會對這些預設檔案進行。第二個樣式則使用明示的文件描述符。

當使用非明示的文件描述符時,所有操作都是由 `io` 表格提供的。當使用明示的文件描述符時,`io.open` 操作會回傳一個文件描述符,然後所有操作就會由文件描述符以方法的形式提供。

`io` 表格也提供了三個預先定義的文件描述符,這些描述符有其在 C 中慣用的意義:`io.stdin`、`io.stdout` 和 `io.stderr`。

文件描述符是一個 userdata,其中包含了檔案串流 `(FILE*)`,以及 I/O 函式庫建立的一個特殊元表格。

除非另外聲明,否則所有 I/O 函式都會在發生錯誤時回傳 `nil`(以及一個錯誤訊息作為第二個結果),並在成功時回傳一個與 `nil` 不同的值。

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

此函式會開啟一個檔案,其模式由字串 mode 指定。這會回傳一個新的文件描述符,或在產生錯誤時回傳 `nil` 加上一個錯誤訊息。

mode 字串可以是下列任何一種:

mode 字串也能在結尾處加上一個 b,在某些系統中,這是開啟檔案為二進制模式時必要的。這個字串明確指出在標準 C 函式 fopen 中使用的內容。

io.close ([file])

等同於 `file:close`。如果沒有檔案,就會關閉預設輸出檔案。

io.flush ()

等同於對預設輸出檔案進行 `file:flush`。

io.input ([file])

當使用檔案名稱呼叫時,它會開啟指定的檔案(以文字模式),並將其用於預設輸入描述符。當使用文件描述符呼叫時,它只會將該文件描述符設定為預設輸入檔案。當沒有參數時呼叫時,它會回傳目前的預設輸入文件描述符。

如果發生錯誤,此函式會引發錯誤,而不是回傳錯誤碼。

io.lines ([filename])

以讀取模式開啟給定的檔名,並回傳一個迭代器函式,每次呼叫時都會從檔案中回傳一行。因此,結構

for line in io.lines(filename) do ... end

會對檔案中的所有行進行迭代。當迭代器函式偵測到檔案結尾時,它會關閉檔案並回傳 `nil`(以完成迴圈)。

函式呼叫 `io.lines()`(沒有檔名)等同於 `io.input():lines()`,也就是說,它會對預設輸入檔案中的行進行迭代。

io.output ([file])

類似於 io.input,但對預設輸出檔案執行操作。

io.read (format1, ...)

等同於 io.input():read

io.tmpfile ()

傳回一個暫存檔案的描述器。此檔案會以更新模式開啟,而且在程式結束時會自動將它移除。

io.type (obj)

檢查 obj 是否為有效檔案描述器。如果 obj 是開啟的檔案描述器,傳回字串 "file";如果 obj 是已關閉的檔案描述器,傳回 "closed file";如果 obj 不是檔案描述器,傳回 nil

io.write (value1, ...)

等同於 io.output():write

f:close ()

關閉檔案 f

f:flush ()

將寫入的任何資料儲存到檔案 f 中。

f:lines ()

傳回一個迭代器函式,每次呼叫時,會從檔案 f 中傳回一行程式碼。因此,建立

for line in f:lines() do ... end

會對檔案 f 的全部行程式碼進行反覆運算。(不同於 io.lines,此函式不會在迴圈結束時關閉檔案。)

f:read (format1, ...)

根據指定格式讀取檔案 f。這些格式會指定要讀取什麼內容。對於每種格式,此函式會傳回包含已讀取字元的字串 (或數字),或是在使用指定格式無法讀取資料時傳回 nil。如果在不指定格式的情況下呼叫,它會使用預設格式來讀取下一行程式碼的全部內容 (見下文)。

可用格式有

f:seek ([whence] [, offset])

設定並傳回檔案 f 的索引位置,以檔案開頭為基準,到由偏移量和下列字串 whence 所指定的基礎位置,如下

在成功的情況下,seek 函式會傳回最終檔案位置,以位元組為單位,從檔案開頭起計算。如果此函式失敗,它會傳回 nil,並附加描述錯誤的字串。

whence 的預設值為 "cur",offset 的預設值為 0。因此,呼叫 file:seek() 會傳回目前的檔案位置,而不會變更;呼叫 file:seek("set") 會將位置設定到檔案開頭 (並傳回 0);呼叫 file:seek("end") 會將位置設定到檔案結尾,並傳回檔案大小。

f:write (value1, ...)

將每個參數的值寫入檔案 f 。這些參數必須是字串或數字。若要寫入其他值,請在寫入之前使用 tostringstring.format

另請參閱


近期異動 · 喜好設定
編輯 · 歷史紀錄
最後編輯於 2010年9月18日 下午6:56 分(GMT) (版本差異)