在lua中读取长行文件

我想在 Windows 上使用 Lua 逐行读取 ".ods" 文件。我用过的代码在另一个平台上可以正常工作,但在 Windows 上失败了。所以我改变了代码来看看发生了什么:

local fhandler = io.open(path,"r")
print(pcall(fhandler.read,fhandler,"*l"))
print(pcall(fhandler.read,fhandler,"*l"))
print(pcall(fhandler.read,fhandler,"*l"))

我得到的输出如下:

true <?xml version="1.0" encoding="UTF-8"?>
false function: 0x003d39e0
true :tc:opendocument:xmlns:script:1.0" [...] office:version="1.2">

所以代码在 ".ods" 文件的第二行失败。我不确定为什么 pcall 在这里返回一个函数,但重要的是,“第三”行内容以“:tc:opendoc…” 开头,属于 ".ods" 文件的第二行。我很确定这是第二行的第1025个字符。

我猜下面的情况正在发生:Lua 内部有一个 1024 字节的缓冲区用于读取整行。因此,第二行仅读取到第1024个字符,然后缓冲区可能已满。Lua 继续读取该行的其余部分。这也可以解释为什么代码可以在其他平台上工作,因为缓冲区的大小可能设置为另一个值。

我知道你可以通过指定自己的缓冲区来读取文件块,例如:

fhandler:read(2048,"*l")

但这对此处没有帮助,因为它将以2048字节的块导入文件,并不会在行的末尾停止。因此,您需要解析导入的数据并查找换行符等。

所以最后,我的问题是:Lua 内部是否有一个缓冲区,其长度为一次可读取的行的长度,可能设置为1024字节?如何更改此缓冲区的大小?

点赞