前言#
從文章的題目可以看出,今天的內容是和文件的行相關的,其實這個函可以看成是一個文件讀取函數,只不過文件讀取的形式固定了,就是只能一行一行的讀,接下來我們就一起來看看這個函數究竟要怎么使用。
內容#
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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。