Io 在Lua中读取整个文件

Io 在Lua中读取整个文件,io,lua,Io,Lua,我试图读取完整的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:r

我试图读取完整的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

对于我的testfile,这表明执行了256次读取操作,读取的总大小约为113kB(整个文件约为7MB)。虽然这应该足以读取大多数id3标记,但我想知道Lua为什么会这样做(特别是因为它在读取大型基于文本的文件(如*.obj或*.ase)时不会这样做)。对于这种行为有什么解释,或者可能有可靠地读取整个文件的解决方案吗?

我肯定遗漏了什么,但我不明白为什么需要循环。这应该可以工作(但最好添加错误处理,以防文件无法打开):


你在windows上吗?确保以二进制模式(“rb”到io.open)Argh打开文件,这就是重点。以前从未使用过二进制模式。多谢各位!有人能解释一下函数中的格式*all
f:read(“*all”)
?似乎“*all”等于“*a”?我在lua manual@liuhao中找不到该文档,前两个字符(a
*a
)被忽略后的所有字符都被忽略了,根据这个答案:我想我是从pil的这一章中得到的:,优点是(我想)你不必记住a
*a
*n
*l
代表什么,因为你可以把它写出来。从对我问题的评论中可以看出,@daurnimator已经发现问题是缺少的b,但无论如何还是要感谢你的回答:)编辑:我将你的答案标记为已接受,以便向人们表明我的问题已解决。
function readAll(file)
    local f = assert(io.open(file, "rb"))
    local content = f:read("*all")
    f:close()
    return content
end