在Lua中逐行读取文件

时间:2013-11-01 10:45:41

标签: file-io lua

根据Lua文档,file:read("*l")读取跳过行尾的下一行。

  

注意: - “* l”:读取跳过行尾的下一行,在文件末尾返回nil。这是默认格式

这个文件是对的吗?因为file:read("*l")读取当前行,而不是下一行或我的理解是错误的?很混乱...

2 个答案:

答案 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 中:

  • "*all" : 读到文件末尾
  • "*line" :从当前位置读取到行尾。 行尾由一个特殊字符标记,通常表示 LfCr(换行,回车)
  • "*number" : 读取一个数字,即会读到什么的末尾 它在文本中识别为一个数字,例如停在一个 逗号“,”。
  • num : 读取最多包含 num 个字符的字符串

这里有一个例子,它把一个包含数字列表的文件读入一个数组(一个表),然后返回这个数组。 (只需将“*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