7

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

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

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

4

2 回答 2

5

Lua 使用与底层 C 实现相同的模型来管理文件(该模型也被其他编程语言使用,并且相当普遍)。如果您不熟悉这种查看文件的方式,则该术语确实可能不清楚。

在此模型中,文件被表示为具有所谓的当前位置的字节流。当前位置是一种概念指针,指向文件中将由下一次I/O 操作读取或写入的第一个字节。当您打开一个文件进行读取时,会设置一个新流,使其当前位置是文件的开头,即当前位置“指向”文件中的第一个字节。

在 Lua 中,您通过所谓的文件句柄来管理流,文件句柄是底层流的一种中介。您使用句柄执行的任何操作都会转移到相应的流中。

Luaio.open打开一个文件,关联一个 C 流与它并返回一个代表该流的文件句柄:

local file_handle = io.open( "myfile.txt" ) -- file opened for reading

因此,如果您执行读取某些字节(通常解释为字符,如果您使用文本文件)的任何操作,这些字节将从流中读取,并且对于每个读取的字节,流的当前位置前进一个,每次指向下一个要读取的字节。

Lua 文档暗示了这个模型。因此,当它说next line时,意味着输入操作将从当前位置开始读取流中的所有字符,直到找到行尾字符。

请注意,如果您将文本文件视为一系列行,您可能会被误导,因为您可能会想到“当前行”和“下一行”。与 C 模型相比,这将是一个更高级别的模型。C 中没有“当前行”。在 C 中,文本文件只不过是一个字节序列,其中一些特殊字符(行尾字符)经过一些特殊处理(主要取决于实现)并由一些 C 标准函数作为行终止符,即作为停止读取字符时检测的标记。

对于新手或来自高级语言的人来说,另一个混淆的来源是,在 C 中,由于历史事故,字节被处理为字符(处理单个字节的基本数据类型是char,这是 C 中最小的数字类型!)。因此,对于具有 C 背景的人来说,将字节视为字符是很自然的,反之亦然。

尽管 Lua 是一种比 C 高级得多的语言,但它与 C 的密切关系(它被设计为易于与 C 代码交互)使其继承了这种 C“字节作为字符”方法的一部分。事实上,例如,Lua 字符串可以保存任意字节,并可用于处理原始二进制数据。

于 2013-11-01T14:08:18.010 回答
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
于 2021-05-25T00:14:16.313 回答