2012-04-30 22 views
16

id3タグを読むためにフルmp3ファイルを読み込もうとしています。それは私がファイルに気付いたときです: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 

、これは〜113KB(ファイル全体の合計を読んで、256の読み出し動作が実行されていることを示しています。だから私は、ファイル全体の内容を取得するために、回避策のいくつかの種類を構築しようとしました〜7MBです)。これは大部分のid3タグを読み込むのに十分なはずですが、なぜLuaがこのように動作するのだろうと思います(特に、* .ojや* .aseなどの大きなテキストベースのファイルを読み込んでいないためです)。この動作や、ファイル全体を確実に読み取るための解決策について何か説明はありますか?

+5

窓がありますか?バイナリモード( "rb"からio.open)でファイルを開くことを確認してください – daurnimator

+1

Argh、それがポイントでした。以前はバイナリモードを使用していたことはありません。大いに感謝する! –

+0

誰かが関数 'f:read(" * all ")'で*** all **の形式を説明できますか? 「* all」は「* a」に等しいと思われますか?私はドキュメントをluaマニュアルで見つけることができませんでしたhttps://www.lua.org/manual/5.1/manual.html#pdf-file:read –

答えて

44

私は何かが欠けているに違いないが、なぜループが必要なのか分からない。これはうまくいくはずです(ただし、ファイルを開くことができない場合には、エラー処理を追加する方がよいでしょう)。

function readAll(file) 
    local f = assert(io.open(file, "rb")) 
    local content = f:read("*all") 
    f:close() 
    return content 
end 
+1

私の質問へのコメントに見ることができるように、@ daurnimatorはすでに問題が欠落していたbを知っていましたが、とにかくあなたの答えに感謝:) 編集:私の質問は、解決されました。 –

関連する問題