Io 函式庫教學 |
|
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
。如果在不指定格式的情況下呼叫,它會使用預設格式來讀取下一行程式碼的全部內容 (見下文)。
可用格式有
nil
。這是預設格式。nil
。如果數字為零,它不會讀取任何內容,並傳回空字串,或是在檔案結尾時傳回 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
。這些參數必須是字串或數字。若要寫入其他值,請在寫入之前使用 tostring
或 string.format
。