【发布时间】:2012-05-10 07:53:55
【问题描述】:
我正在尝试读取完整的 mp3 文件以读出 id3 标签。那时我注意到 file:read("*a") 显然没有读取完整文件,而是读取一小部分。所以我尝试构建某种解决方法来获取整个文件的内容:
function readAll(file)
local f = io.open(file, "r")
local content = ""
local length = 0
while f:read(0) ~= "" do
local current = f:read("*all")
print(#current, length)
length = length + #current
content = content .. current
end
return content
end
对于我的测试文件,这表明执行了 256 次读取操作,总共读取了 ~113kB(整个文件为 ~7MB)。虽然这应该足以读取大多数 id3 标签,但我想知道为什么 Lua 会以这种方式运行(尤其是因为它在读取大型文本文件(如 *.obj 或 *.ase)时不会这样做)。对此行为是否有任何解释,或者是否有可靠读取整个文件的解决方案?
【问题讨论】:
-
你在windows上吗?确保以二进制模式打开文件(“rb”到 io.open)
-
啊,这就是重点。以前从未使用过二进制模式。非常感谢!
-
有人能解释一下函数
f:read("*all")中的格式*all吗?似乎 "*all" 等于 "*a" ?我在 lua 手册中找不到文档lua.org/manual/5.1/manual.html#pdf-file:read -
@liuhao 前两个字符(
*a)之后的所有字符都被忽略,根据这个答案:stackoverflow.com/questions/47277203/…我想我是从这章在 pil 回来的日子里得到的:@987654323 @,优点是(我猜)你不必记住*a、*n和*l代表什么,因为你可以把它写出来。