根据Lua文档,file:read("*l")
读取跳过行尾的下一行。
注意: - “* l”:读取跳过行尾的下一行,在文件末尾返回nil。这是默认格式
这个文件是对的吗?因为file:read("*l")
读取当前行,而不是下一行或我的理解是错误的?很混乱...
答案 0 :(得分:4)
Lua使用相同的底层C实现模型管理文件(此模型也被其他编程语言使用,这是相当常见的)。如果你不熟悉这种查看文件的方式,那么术语确实可能不清楚。
在此模型中,文件表示为字节流,具有所谓的当前位置。当前位置是指向文件中第一个字节的概念指针,该字节将由 next I / O操作读取或写入。当您打开文件进行读取时,会设置一个新流,使其当前位置是文件的开头,即当前位置“指向”文件中的第一个字节。
在Lua中,您通过所谓的文件句柄来管理流,这些是基础流的中介。使用句柄执行的任何操作都会转移到相应的流中。
Lua io.open
打开一个文件,将C流与之关联,并返回表示该流的文件句柄:
local file_handle = io.open( "myfile.txt" ) -- file opened for reading
因此,如果执行任何读取某些字节的操作(通常解释为字符,如果使用文本文件),则从流中读取这些字节,并为每个字节读取当前位置流前进一个,每次指向要读取的 next 字节。
Lua文档暗示了这个模型。因此,当它显示 next 行时,表示输入操作将从当前位置开始读取流中的所有字符< / em>直到找到行尾字符。
请注意,如果您将文本文件视为一系列行,则可能会被误导,因为您可以想到“当前行”和“下一行”。与C模型相比,这将是更高级别的模型。 C中没有“当前行”。在C文本文件中只有一个字节序列,其中一些特殊字符(行尾字符)经过一些特殊处理(主要依赖于实现)并由某些C标准函数作为行终止符,即作为标记来检测何时停止读取字符。
新手或来自更高级别语言的人的另一个混淆源是在C中,对于历史事故,字节被处理为字符(处理单个字节的基本数据类型是char
,这是C中最小的数字类型!)。因此,对于具有C背景的人来说,将字节视为字符是很自然的,反之亦然。
尽管Lua是一种比C更高级的语言,但它与C的密切关系(它被设计为易于与C代码接口)使得它继承了这种C“字节为字符”方法的一部分。实际上,例如,Lua字符串可以保存任意字节,并可用于处理原始二进制数据。
答案 1 :(得分:1)
就像 Lorenso 上面所说的,读取从当前文件位置开始,然后从该位置读取文件的某些部分。它读取多少文件取决于读取指令。供参考,在 Lua 5.3 中:
这里有一个例子,它把一个包含数字列表的文件读入一个数组(一个表),然后返回这个数组。 (只需将“*number”更改为“*line”,它就会逐行读取文件):
function read_array(file)
local arr = {}
local handle = assert( io.open(file,"r") )
local value = handle:read("*number")
while value do
table.insert( arr, value )
value = handle:read("*number")
end
handle:close()
return arr
end