第一版是針對 Lua 5.0 編寫的。儘管在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買這本書,您也可以 支援 Lua 專案。
![]() |
用 Lua 程式設計 | ![]() |
第三部分。標準函式庫 第 21 章。I/O 函式庫 |
簡單的模型函式 io.input
和 io.output
總是會以文字模式開啟檔案(預設)。在 Unix 中,二進位檔案和文字檔案沒有差別。但在某些系統(特別是 Windows)中,必須使用特殊旗標來開啟二進位檔案。若要處理此類二進位檔案,您必須使用 io.open
,並在模式字串中加上字母 `b
´。
Lua 中的二進位資料處理方式類似於文字。Lua 中的字串可以包含任何位元組,函式庫中的幾乎所有函式都可以處理任意位元組。(您甚至可以對二進位資料進行模式比對,只要模式不包含零位元組即可。如果您想要比對零位元組,您可以改用類別 %z
。)
通常,您可以使用 *all
模式(會讀取整個檔案)或模式 n(會讀取 n 個位元組)來讀取二進位資料。舉例來說,下列程式會將 DOS 格式的文字檔案轉換成 Unix 格式(也就是將換行符號-換行符號的順序轉換成換行符號)。它不會使用標準 I/O 檔案(stdin
/stdout
),因為這些檔案是以文字模式開啟的。反之,它假設輸入檔案和輸出檔案的名稱會作為程式參數提供
local inp = assert(io.open(arg[1], "rb")) local out = assert(io.open(arg[2], "wb")) local data = inp:read("*all") data = string.gsub(data, "\r\n", "\n") out:write(data) assert(out:close())您可以使用下列命令列呼叫此程式
> lua prog.lua file.dos file.unix
再舉一個例子,下列程式會列印在二進位檔案中找到的所有字串。此程式假設字串是任何由六個或更多個有效字元組成的零終止順序,其中有效字元是模式 validchars
所接受的任何字元。在我們的範例中,這包括英數字元、標點符號和空白字元。我們使用串接和 string.rep
來建立一個模式,用來擷取所有由六個或更多個 validchars
組成的順序。模式末尾的 %z
會比對字串末尾的零位元組。
local f = assert(io.open(arg[1], "rb")) local data = f:read("*all") local validchars = "[%w%p%s]" local pattern = string.rep(validchars, 6) .. "+%z" for w in string.gfind(data, pattern) do print(w) end
最後一個範例,下列程式會傾印二進位檔案。同樣地,第一個程式參數是輸入檔名;輸出會傳送到標準輸出。此程式會以 10 個位元組為單位讀取檔案。對於每個區塊,它會寫入每個位元組的十六進位表示法,然後將區塊寫入文字,並將控制字元改為點。
local f = assert(io.open(arg[1], "rb")) local block = 10 while true do local bytes = f:read(block) if not bytes then break end for b in string.gfind(bytes, ".") do io.write(string.format("%02X ", string.byte(b))) end io.write(string.rep(" ", block - string.len(bytes) + 1)) io.write(string.gsub(bytes, "%c", "."), "\n") end假設我們將程式儲存在名為
vip
的檔案中;如果我們將程式套用於它自己,並呼叫
prompt> lua vip vip它將產生類似這樣的輸出(在 Unix 機器中)
6C 6F 63 61 6C 20 66 20 3D 20 local f = 61 73 73 65 72 74 28 69 6F 2E assert(io. 6F 70 65 6E 28 61 72 67 5B 31 open(arg[1 5D 2C 20 22 72 62 22 29 29 0A ], "rb")). ... 22 25 63 22 2C 20 22 2E 22 29 "%c", ".") 2C 20 22 5C 6E 22 29 0A 65 6E , "\n").en 64 0A d.
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |