Lua io.lines()


前言#

從文章的題目可以看出,今天的內容是和文件的行相關的,其實這個函可以看成是一個文件讀取函數,只不過文件讀取的形式固定了,就是只能一行一行的讀,接下來我們就一起來看看這個函數究竟要怎么使用。

內容#


iolines()##

  • 原型:io.lines ([filename])
  • 解釋:按文件名以讀的模式打開一個文件,並且返回一個迭代函數,這個迭代函數每一次被調用都會返回文件中新的一行的內容,直到文件中所有的內容都被讀完,常用的代碼形式為for line in io.lines(filename) do body end,當迭代函數檢測到文件末尾時,它會返回nil來結束循環並自動關閉文件,這個函數還有另一種表現形式,那就是file:lines(),如果我們不加文件名的話,像這樣io.lines()的函數等價於io.input():lines()

Usage##

  • 首先我們新建一個文件,將文件命名為linestest.lua然后編寫如下代碼:
local contentfunc = io.lines("linestest.txt")
print("contentfunc is :")
print(contentfunc)

print("\nfirst file content is :")

-- 先手動調用一次
local content = contentfunc()
print(content.."\n")

-- 再手動調用一次
local content = contentfunc()
print(content.."\n")

-- 迭代調用
for cnt in contentfunc do
    print(cnt)
end

-- 直接全部迭代調用
print("\nsecond file content is :")
for cnt in io.lines("linestest.txt") do
    print(cnt)
end

-- 使用文件描述符迭代
print("\nthird file content is :")
local myfile = io.open("linestest.txt");
for cnt in myfile:lines() do
    print(cnt)
end

myfile:close()
  • 運行結果
 
io_lines.png

總結#

  • 使用這個函數最重要的一點就是記住這個函數的返回類型,他返回的內容還是一個函數,並且每一次調用這個迭代函數都能取得新一行的值,這個是不是和我們之前講的閉合函數很相似,有興趣的可以再看一下這篇文章Lua closure.
  • 注意函數io.lines(filename)file:lines()的使用有什么不同,實際上后者在函數調用完之后並不會自動關閉文件,代碼最后myfie:close()函數的調用沒有報錯,也說明了這個問題。
  • 由於這個函數是以讀的模式打開文件的,所以要求文件必須存在,否則就會報錯,所有在使用之前最好先檢查一下文件是否存在。


作者:AlbertS
鏈接:https://www.jianshu.com/p/67e56c32413b
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM