22

id3 タグを読み取るために、完全な mp3 ファイルを読み取ろうとしています。そのとき、 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 などの大きなテキストベースのファイルを読み取るときはそうではないため)。この動作の説明や、ファイル全体を確実に読み取るための解決策はありますか?

4

1 に答える 1

64

何かが欠けているに違いありませんが、ループが必要な理由がわかりません。これは機能するはずです (ただし、ファイルを開けない場合に備えて、エラー処理を追加することをお勧めします):

function readAll(file)
    local f = assert(io.open(file, "rb"))
    local content = f:read("*all")
    f:close()
    return content
end
于 2012-04-30T17:32:21.687 に答える