根据Lua文档,file:read("*l")读取下一行跳过行尾.
注意: - "*l":读取跳过行尾的下一行,在文件末尾返回nil.这是默认格式
这个文件对吗?因为file:read("*l")读取当前行,而不是下一行或我的理解是错误的?相当混乱......
Lua使用与基础C实现相同的模型来管理文件(其他编程语言也使用该模型,这非常普遍)。如果您不熟悉这种查看文件的方式,则实际上可能不清楚该术语。
在此模型中,文件表示为具有所谓当前位置的字节流。当前位置是一种指向文件中第一个字节的概念性指针,该文件将由下一个 I / O操作读取或写入。当您打开文件进行读取时,将设置一个新的流,以使其当前位置为文件的开头,即当前位置“指向”文件中的第一个字节。
在Lua中,您通过所谓的文件句柄管理流,这些文件句柄是基础流的一种中介。您使用该句柄执行的任何操作都会转移到相应的流中。
Lua io.open打开一个文件,将一个C流与其关联,并返回代表该流的文件句柄:
local file_handle = io.open( "myfile.txt" ) -- file opened for reading
Run Code Online (Sandbox Code Playgroud)
因此,如果您执行任何读取某些字节的操作(如果使用文本文件,则通常解释为字符)将从流中读取,并且对于每个字节读取,流的当前位置前进一个,每次指向下一个要读取的字节。
Lua文档暗示了这种模型。因此,当它说到下一行时,意味着输入操作将从当前位置开始读取流中的所有字符,直到找到行尾字符。
请注意,如果您将文本文件视为一系列行,则可能会被误导,因为您会想到“当前行”和“下一行”。与C模型相比,那将是一个更高级别的模型。C中没有“当前行”。在C文本文件中,字节序列只不过是一些特殊字符(行尾字符)经过某种特殊处理(主要取决于实现)而由以下字节使用一些C标准用作行终止符,即用作检测何时停止读取字符的标记。
对于新手或来自高级语言的人们,造成混淆的另一个原因是,在C中,由于历史原因,字节被当作字符来处理(处理单个字节的基本数据类型是char,这是C中最小的数字类型!)。因此,对于具有C背景的人们来说,很自然地将字节视为字符,反之亦然。
尽管Lua是比C更高级的语言,但它与C的紧密关系(旨在与C代码轻松地接口)使其继承了这种C“以字符为单位”方法的一部分。实际上,例如,Lua字符串可以容纳任意字节,并且可以用于处理原始二进制数据。