2

我想.ods在 Windows 上使用 lua 逐行读取文件。我曾经这样做的代码在另一个平台上工作,但在 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 字符。

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

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

fhandler:read(2048,"*l")

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

所以最后,我的问题是:是否有一个可以设置为 1024 字节的可以一次读取的行长度的 lua 内部缓冲区?你怎么能改变这个缓冲区的大小?

4

0 回答 0