Lua雜記一 檔案讀寫 table庫 字串庫

2021-06-26 14:06:01 字數 3329 閱讀 6438

一、table的解釋(雲風說的很好,摘抄如下):

lua 的整體效率是很高的,其中,它的 table 實現的很巧妙為這個效率貢獻很大。

lua 的 table 充當了陣列和對映表的雙重功能,所以在實現時就考慮了這些,讓 table 在做陣列使用時盡量少效率懲罰。

lua 是這樣做的。它把乙個 table 分成陣列段和 hash 段兩個部分。數字 key 一般放在陣列段中,沒有初始化過的 key 值全部設定為 nil 。當數字 key 過於離散的時候,部分較大的數字 key 會被移到 hash段中去。這個分割線是以陣列段的利用率不低於 50% 為準。 0 和 負數做 key 時是肯定放在 hash 段中的。

string 和 number 都放在一起做 hash ,分別有各自的演算法,但是 hash 的結果都在乙個數值段中。hash 段採用閉雜湊方法,即,所有的值都存在於表中。如果hash 發生碰撞,額外的資料記在空閒槽位里,而不額外分配空間存放。當整個個表放滿後,hash 段會擴大,所有段內的資料將被重新 hash ,重新 hash 後,衝突將大大減少。

這種 table 的實現策略,首先保證的是查詢效率。對於把 table 當陣列使用時將和 c 陣列一樣高效。對於 hash 段的值,查詢幾乎就是計算 hash 值的過程(其中string 的 hash 值是事先計算好儲存的),只有在碰撞的時候才會有少許的額外查詢時間,而空間也不至於過於浪費。在 hash 表比較滿時,插入較容易發生碰撞,這個時候,則需要在表中找到空的插槽。lua 在table 的結構中記錄了乙個指標順次從一頭向另一頭循序插入來解決空槽的檢索。每個槽點在記錄 next 指標儲存被碰撞的 key 的關聯性。

整個來說,這種解決方法是非常不錯的。

< a href="">在 vector , map , list 間取得平衡

二、檔案讀寫

檔案讀寫對製作遊戲很有幫助。可以呼叫別的檔案中的**,儲存最高分、遊戲存檔、玩家狀態等信寫到檔案中。

首先,讓我們看乙個簡單的命令: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() 

三、字串庫

四、其他

1、取table長度操作符 #

python(一) 檔案操作

my file open my file.txt w 用法 open 檔名 形式 其中形式有 w write r read.my file.write text 該語句會寫入先前定義好的 text my file.close 關閉檔案 this is my first test.this is th...

一 檔案安全與許可權

檔案 當我們建立乙個檔案的時候,系統儲存了有關該檔案的全部資訊,包括 檔案的位置。檔案型別。檔案長度。哪位使用者擁有該檔案,哪些使用者可以訪問該檔案。i節點。檔案的修改時間。檔案的許可權位。讓我們使用ls l命令,來看乙個典型的檔案 root linux ll total 80 rw r r 1 r...

linux(一)檔案處理命令

一 檔案處理命令 ls 選項 檔案或目錄 選項 a 顯示所有檔案,包括隱藏檔案 l 顯示詳細資訊 d 檢視目錄屬性 h 人性化顯示檔案大小 i 顯示inode 檔案型別 檔案 d 目錄 l 軟連線檔案 u 所有者 g所屬組 o其他人 r 讀 w 寫 x 執行 mkdir 建立目錄 p 遞迴建立目錄 ...