*Luaライブラリ 要注意点 ~入出力ライブラリ~ [#b5c1a5a2]

**printは最後に改行が付く、io.writeは改行が付かない。 [#t553fe49]
>両方ともリストを引き受けるが、~
~
''print(リスト)はタブで連結し、最後は改行を付加。''~
''printは常に標準出力。~
~
~''io.write(リスト)は純粋に連結するのみ。''~
''io.writeは現在割り当てられている出力ハンドルが対象。切り替え可能。''~
''(ファイルor標準出力or標準エラーなど、とにかく現在割り当てられているハンドル)''

**io.read (···) [#v9533761]
>io.input():read(···) と同等。
|~引数|~説明|
|"*all"|ファイル全体を読み込みます。|
|"*line"|次の行を読み込みます。|
|"*number"|数値を読み込みます。|
|<num>|最大で<num>文字の文字列を読み込みます。|

**効率の良い読み込みと出力 [#n5e142ef]
>Luaにおいて、最も効率が良いのは、''全部を読み込んで、処理して、出力する''というもの。
#sh(lua]){{
t = io.read("*all")     --> 一気に読み込む
t = string.gsub(t, …)   --> 何か処理
io.write(t)             --> 出力
}}

**Luaのデフォルトのファイル読み込み単位は「行」 [#a5c098f2]
>次にio.read(*line)も良くある。*lineと指定しなくともread()のデフォルトはこの*lineである。~
読み込むのは一行ずつだが、最後の改行はtrimされる。~
一番最後に読み込むものが無くなれば、nilを返す。~
#sh(lua]){{
for count = 1, math.huge do  -- 無限ループ
    local line = io.read()
    if line == nil then break end
    io.write(string.format("%6d  ", count), line, "\n")
end
}}
ただし、io.lines()イテレータを使用する方が自然である。
#sh(lua]){{
local lines = {}
for line in io.lines() do
    lines[#lines+1] = line
end

table.sort(lines)

for _, l in ipairs(lines) do
    io.write(l, "\n")
end
}}

**io.read("*number") [#db8d5003]
>io.read("*number") は数値入力を受け付ける。~
前に空白系の文字があったら無視される。~
~
''一行に複数の数値が入っていることが期待される場合、その個数分だけ"*number"を記載すれば良い。''
#sh(lua]){{
data部
   6.0    -3.23    15e12
     4.3     234     1000001

io.read("*number", "*number", "*number")
}}
#sh(lua]){{
while true do
    local n1, n2, n3 = io.read("*number", "*number", "*number")
    if not n1 then break end  --真ではない。nil or false
    print(math.max(n1,n2,n3))
end
}}


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS