文件讀寫 文件讀寫對制作游戲很有幫助。可以調用別的文件中的代碼,保存最高分、游戲存檔、玩家狀態等信寫到文件中。 首先,讓我們看一個簡單的命令:dofile。這個命令會讀入另一個文件的代碼並立即執行。 代碼: dofile("./test.lua") 很簡單的命令。注意 ./ 是指根目錄,不是子目錄。如果是子目錄,應該這樣用: 代碼: dofile("./files/test.lua") 那么,如果我們的文件 test.lua 包含下述代碼: 代碼: playerx = 10 playery = 20 enemyx = 40 enemyy = 50 一旦我們用 dofile 調用這個文件,這些變量將立即得到聲明。文件不是非得用 lua 后綴,txt 或其他后綴都可以。 從文件中讀取一行: 假設你有一個很多行文本的文件,你想從中讀取一行,並打印到屏幕上。為此我們可以使用 io.open() 命令打開文件並讀取。 命令的語法是 io.open(filename, mode)。此處我們將使用 r 作為 mode 的值,意指讀取(read)模式。作為參考,下面是所有可用模式的列表: 引用: r - 讀取模式w - 寫入模式(覆蓋現有內容) a - 附加模式(附加在現有內容之后) b - 二進制模式 r+ - 讀取更新模式(現有數據保留) w+ - 寫入更新模式(現有數據擦除) a+ - 附加更新模式(現有數據保留,只在文件末尾附加) 第一件要做的事情就是打開文件並存為一個變量。看下面。 代碼: file = io.open("testRead.txt", "r") 現在我們的文件 testRead.txt 已打開並處於讀取模式。接着我們使用 read() 命令讀取文件中的單行內容存為另一個變量。 代碼: ourline = file:read() 這將讀取我們的文本文件的第一行。下一次我們使用 read() 命令它將讀取第二行。再下一次它會讀取第三行,依此類推。 請注意,此命令前的 file 是我們之前打開文件並保存的變量名,你可以使用任何其他名字。file.read() 還可以使用下列任一個參數,只要用引號括起來放入括號里就可以。 引用: *n - 讀取一個數字並返回它。例:file.read("*n") *a - 從當前位置讀取整個文件。例:file.read("*a") *l - (默認) - 讀取下一行,在文件尾 (EOF) 處返回 nil。例:file.read("*l") number - 返回一個指定字符個數的字符串,或在 EOF 時返回 nil。例:file.read(5) 既然我們已經讀取到所要的那一行,我們需要關閉打開的文件,像這樣: 代碼: file:close() 現在要打印我們的文件至屏幕我們只要這么做: 代碼: screen:print(10,10,ourline,white) 讀取所有行 要讀取一個文件的所有行,你可以在一個 for 語句中使用上述技巧。請看下述代碼: 代碼: y = 10 file = io.open("testRead.txt","r") for line in file:lines() do y = y + 10 screen:print(100,y,line,white) endf ile:close() 這個代碼設置了一個起始值 y 用於打印,這樣它可以在屏幕不同的縱坐標打印每一行。照例,先打開文件。然后是 for 語句,這句代碼是說文件的行數有多少下面的代碼就執行幾次。我們的 y 坐標則每次循環加上 10 以便打印命令可以打印下一行。 寫入文件(覆蓋) 寫入文件的方式大致相同。下面的代碼將覆蓋任何先前寫入文件的內容: 代碼: file = io.open("testRead.txt","w")file:write("hello")file:close() 注意,我們這次使用了 w 模式,而不是 r 模式,因為我們是要寫入而不是讀取。我們用 file:write() 寫入括號里作為參數的、用引號括起來的文本。你也可以用變量替代。如果你使用變量就不要用引號,請看下例: 代碼: file = io.open("testRead.txt","w")myText = "Hello"file:write(myText)file:close() 寫入文件(附加) 你可以使用附加模式,這樣就可以在寫入文件時將新內容附加在已有文本末尾,而不是刪除原來的。做法與上面基本相同,除了模式換成“附加”之外。請看代碼: 代碼: file = io.open("testRead.txt","a")myText = "\nHello"file:write(myText)file:close()