この初版は Lua 5.0 向けに書かれました。後期バージョンにはまだ大きく関連していますが、いくつかの相違点があります。
第 4 版は Lua 5.3 を対象にしており、Amazon などの書店で購入できます。
本を購入すると、Lua プロジェクトへのサポートにもなります。
![]() |
Lua によるプログラミング | ![]() |
第 III 部 標準ライブラリ 第 21 章 I/O ライブラリ |
通常 Lua では、ファイルを 1 行ずつ読み込むよりも、ファイル全体を一括で読み込んだ方がはるかに高速です。ただし、何十 MB、何百 MB といった大きなファイルの場合には、一度に全部を読み込むことは現実的ではありません。そのような大きなファイルを最高の性能で処理したい場合には、最も高速な方法は適度に大きなチャンク(例: 8 KB) で読み込むことです。途中で改行を切ってしまうという問題を回避するには、1 つのチャンクと 1 つの行を一緒に読み込みます。
local lines, rest = f:read(BUFSIZE, "*line")変数
rest
には、チャンクで切れてしまった行の残りの部分が格納されます。チャンクとこの行の残りの部分をつなげます。このようにすることで、結果のチャンクは常に改行で区切られます。この技法の典型的な例として、ファイル内の文字、単語、行の数をカウントするプログラム wc の実装があります。
local BUFSIZE = 2^13 -- 8K local f = io.input(arg[1]) -- open input file local cc, lc, wc = 0, 0, 0 -- char, line, and word counts while true do local lines, rest = f:read(BUFSIZE, "*line") if not lines then break end if rest then lines = lines .. rest .. '\n' end cc = cc + string.len(lines) -- count words in the chunk local _,t = string.gsub(lines, "%S+", "") wc = wc + t -- count newlines in the chunk _,t = string.gsub(lines, "\n", "\n") lc = lc + t end print(lc, wc, cc)
Copyright © 2003–2004 Roberto Ierusalimschy。すべての権利を保有します。 | ![]() |