Lua ファイル I/O

Lua I/O ライブラリは、ファイルの読み取りと処理を行うために使用されます。シンプルモード(C言語と同じ)と完全モードに分かれます。

  • シンプルモードは、現在の入力ファイルと現在の出力ファイルを1つずつ持ち、これらのファイルに関連する操作を提供します。
  • 完全モードは、外部のファイルハンドルを使用して実装します。オブジェクト指向の形式で、すべてのファイル操作をファイルハンドルのメソッドとして定義します。

シンプルモードは、簡単なファイル操作を行う場合に適しています。しかし、高度なファイル操作を行う場合、シンプルモードでは力不足になります。例えば、複数のファイルを同時に読み取るような操作は、完全モードを使用する方が適しています。

ファイルを開く操作文は次のとおりです:

file = io.open (filename [, mode])

mode の値は次のとおりです:

モード説明
r読み取り専用でファイルを開きます。このファイルは存在している必要があります。
w書き込み専用ファイルを開きます。ファイルが存在する場合、ファイルの長さは0にクリアされ、つまりファイルの内容は消えます。ファイルが存在しない場合は、そのファイルを作成します。
a追記方式で書き込み専用ファイルを開きます。ファイルが存在しない場合は、そのファイルを作成します。ファイルが存在する場合、書き込まれたデータはファイルの末尾に追加されます。つまり、ファイルの元の内容は保持されます。(EOF記号は保持されます)
r+ 読み書き可能な方式でファイルを開きます。このファイルは存在している必要があります。
w+ 読み書き可能なファイルを開きます。ファイルが存在する場合、ファイルの長さは0にクリアされ、つまりファイルの内容は消えます。ファイルが存在しない場合は、そのファイルを作成します。
a+ aと似ていますが、このファイルは読み書き可能です
b バイナリモード。ファイルがバイナリファイルの場合は、bを追加できます
+ 記号は、ファイルに対して読み取りも書き込みも可能であることを表します

シンプルモード

シンプルモードでは、標準I/Oを使用するか、現在の入力ファイルと現在の出力ファイルを使用します。

以下は file.lua ファイルのコードで、操作するファイルは test.lua です(存在しない場合は、このファイルを作成する必要があります)。コードは次のとおりです:

サンプル

-- 読み取り専用でファイルを開く
file = io.open("test.lua", "r")

-- デフォルトの入力ファイルを test.lua に設定
io.input(file)

-- ファイルの最初の行を出力
print(io.read())

-- 開いたファイルを閉じる
io.close(file)

-- 追記方式で書き込み専用ファイルを開く
file = io.open("test.lua", "a")

-- デフォルトの出力ファイルを test.lua に設定
io.output(file)

-- ファイルの最後の行に Lua コメントを追加
io.write("-- test.lua ファイル末尾のコメント")

-- 開いたファイルを閉じる
io.close(file)

上記のコードを実行すると、test.lua ファイルの最初の行の情報が出力され、そのファイルの最後の行に lua のコメントが追加されたことがわかります。例えば、私の環境での出力は次のとおりです:

-- test.lua 文件

上記のサンプルでは io."x" メソッドを使用しました。io.read() にはパラメータを付けていませんが、パラメータには次の表のいずれかを指定できます:

モード説明
"*n"数字を読み取って返します。例:file.read("*n")
"*a"現在位置からファイル全体を読み取ります。例:file.read("*a")
"*l"(デフォルト)次の行を読み取ります。ファイルの末尾 (EOF) では nil を返します。例:file.read("*l")
number指定した文字数の文字列を返すか、EOF では nil を返します。例:file.read(5)

他の io メソッドには次のものがあります:

  • io.tmpfile():一時ファイルハンドルを返します。このファイルは更新モードで開かれ、プログラム終了時に自動的に削除されます。

  • io.type(file):obj が使用可能なファイルハンドルかどうかを検出します

  • io.flush():バッファ内のすべてのデータをファイルに書き込みます

  • io.lines(optional file name):反復関数を返します。呼び出しのたびにファイル内の1行の内容を取得し、ファイルの末尾に達すると nil を返しますが、ファイルは閉じません。


完全モード

通常、同じ時間に複数のファイルを処理する必要があります。io.function_name メソッドの代わりに file:function_name を使用する必要があります。次のサンプルは、同じファイルを同時に処理する方法を示しています:

サンプル

-- 読み取り専用でファイルを開く
file = io.open("test.lua", "r")

-- ファイルの最初の行を出力
print(file:read())

-- 開いたファイルを閉じる
file:close()

-- 追記方式で書き込み専用ファイルを開く
file = io.open("test.lua", "a")

-- ファイルの最後の行に Lua コメントを追加
file:write("--test")

-- 開いたファイルを閉じる
file:close()

上記のコードを実行すると、test.lua ファイルの最初の行の情報が出力され、そのファイルの最後の行に lua のコメントが追加されたことがわかります。例えば、私の環境での出力は次のとおりです:

-- test.lua 文件

read のパラメータはシンプルモードと同じです。

他のメソッド:

  • file:seek(optional whence, optional offset):現在のファイル位置を設定および取得します。成功すると最終的なファイル位置(バイト単位)を返し、失敗するとnilとエラーメッセージを返します。パラメータ whence の値は次のとおりです:

    • "set": ファイルの先頭から
    • "cur": 現在位置から [デフォルト]
    • "end": ファイルの末尾から
    • offset: デフォルトは0
    パラメータなしの file:seek() は現在位置を返し、file:seek("set") はファイルの先頭に移動し、file:seek("end") はファイルの末尾に移動してファイルサイズを返します。
  • file:flush():バッファ内のすべてのデータをファイルに書き込みます

  • io.lines(optional file name):指定したファイル filename を読み取りモードで開き、反復関数を返します。呼び出しのたびにファイル内の1行の内容を取得し、ファイルの末尾に達すると nil を返し、ファイルを自動的に閉じます。
    パラメータなしの場合、io.lines() <=> io.input():lines(); デフォルトの入力デバイスの内容を読み取りますが、終了時にはファイルを閉じません。例:

    for line in io.lines("main.lua") do
    
      print(line)
    
      end
    

次のサンプルでは seek メソッドを使用して、ファイルの末尾から数えて25番目の位置に移動し、read メソッドの *a パラメータ(現在位置(末尾から25番目の位置)からファイル全体を読み取る)を使用しています。

サンプル

-- 読み取り専用でファイルを開く
file = io.open("test.lua", "r")

file:seek("end",-25)
print(file:read("*a"))

-- 開いたファイルを閉じる
file:close()

私の環境での出力結果は次のとおりです:

st.lua 文件末尾--test
その他の拡張