この初版はLua5.0向けに書かれました。そのほとんどは後発のバージョンにも関連していますが、いくつかの違いがあります。
四版目はLua5.3を対象としており、Amazonやその他の書店で購入できます。
書籍を購入することで、Luaプロジェクトを支援できます。


21.2:完全なI/Oモデル

さらに制御されたI/Oを使用するには、完全なモデルを使用できます。このモデルの中心概念はファイルハンドルであり、C言語のストリーム(FILE*)に相当します。現在の位置を持つ開かれたファイルを表現します。

ファイルをオープンするには、C言語のfopen関数に似たio.open関数を用います。引数として、オープンするファイル名とモード文字列を受け取ります。モード文字列には、読み込み用の`r´、書き込み用の`w´(ファイルの以前の内容が消去されます)、追加用の`a´が含まれます。オプションの`b´を付加するとバイナリファイルを開くことができます。open関数はファイルの新しいハンドルを返します。エラーが発生した場合、opennilとエラーメッセージ、エラー番号を返します。

    print(io.open("non-existent file", "r"))
      --> nil     No such file or directory       2
    
    print(io.open("/etc/passwd", "w"))
      --> nil   Permission denied       13
エラー番号の解釈は、システム依存です。

エラーをチェックする広義的な反復は次のとおりです。

    local f = assert(io.open(filename, mode))
openに失敗した場合、エラーメッセージはassertの第二引数となり、次にメッセージが表示されます。

ファイルをオープンした後、read/writeメソッドを使用してファイルをリードしたり、ファイルに書き込んだりできます。メソッドはread/write関数に似ていますが、コロン記号を使用してファイルハンドルのメソッドとして呼び出します。例えば、ファイルを開いてすべてをリードするには、以下のようなチャンクを使用できます。

    local f = assert(io.open(filename, "r"))
    local t = f:read("*all")
    f:close()

I/Oライブラリはまた、あらかじめ定義された3つのCストリーム、io.stdinio.stdoutio.stderrのハンドルも提供します。このようにして、次のコードのようにエラーストリームに直接メッセージを送信できます。

    io.stderr:write(message)

完全なモデルと単純なモデルを混在させることができます。引数なしでio.input()を呼び出すことで、現在の入力ファイルハンドルを取得できます。io.input(handle)の呼び出しで、現在の入力ファイルハンドルを設定します。(同じ呼び出しはio.outputにも有効です)。例えば、一時的に現在の入力ファイルを変更する場合、次のように記述できます。

    local temp = io.input()   -- save current file
    io.input("newinput")      -- open a new current file
    ...                       -- do something with new input
    io.input():close()        -- close current file
    io.input(temp)            -- restore previous current file