1. ホーム
  2. スクリプト・コラム
  3. ルア

LuaによるファイルI/O操作のチュートリアル

2022-02-10 22:05:56

 LuaのI/Oライブラリは、ファイルの読み込みと操作に使用されます。Luaのファイル操作には、暗黙的ファイルディスクリプタと明示的ファイルディスクリプタの2種類があります。

以下の例では、以下のようなサンプルファイルtest.luaを使用します。

コピーコード コードは以下の通りです。
-- sample test.lua
-- sample2 test.lua

簡単なファイルオープン操作では、次のようなステートメントを使用します。

コピーコード コードは以下の通りです。
file = io.open (filename [, mode])

各種ファイルモードは下表のとおりです。

 隠しファイル記述子

暗黙のファイル記述子は、標準入出力モードを使用するか、または単一入力、単一出力のファイルを使用します。暗黙のファイルを使用するディスクリプタの例を以下に示す。

コピーコード コードは以下の通りです。
-- Opens a file in read
file = io.open("test.lua", "r")

-- sets the default input file as test.lua
io.input(file)

-- prints the first line of the file
print(io.read())

-- closes the open file
io.close(file)

-- Opens a file in append mode
file = io.open("test.lua", "a")

-- sets the default output file as test.lua
io.output(file)

-- appends a word test to the last line of the file
io.write("-- End of the test.lua file")

-- closes the open file
io.close(file)

プログラムを実行すると、test.luaファイルから1行目の出力が得られます。この例では、次のような出力が得られます。

コピーコード コードは以下の通りです。
-- Sample test.lua

これは、宣言されたtest.luaファイルの最初の行です。 "--test.luaファイルの終わり"は、test.luaコードの最後の行に追加されます。

上の例では、ファイルシステムの io."x" メソッドを使用することで、hidden 記述がどのように機能するかを見ることができます。上記の例では、オプションの引数を指定せずに io.read() を使用しています。オプションの引数には、以下のいずれかを指定します。

 その他、一般的なIO方式は以下の通りです。

  •     io.tmpfile()。読み書きが可能な一時ファイルを返します。プログラムが終了すると削除されます。
  •     io.type(ファイル): 入力されたファイルに応じて、ファイルを閉じるか、ゼロを返します。
  •     io.flush()。デフォルトの出力バッファをクリアします。
  •     io.lines(オプションのファイル名): ファイルをトラバースするための汎用ループイテレータを提供し、ファイル名とデフォルトファイルが提供され、ループの最後に閉じられない場合にファイルを閉じます。

明示的なファイル記述子

複数のファイルを同時に操作できるようにするために、明示的なファイル記述子をよく使います。これらの関数は、暗黙のファイル記述子にかなり似ています。ここでは、io.function_name の代わりに file: 関数名を使用しています。同様に、暗黙のファイル記述子の例のファイルバージョンを次の例に示します。

コピーコード コードは以下の通りです。
-- Opens a file in read mode
file = io.open("test.lua", "r")

-- prints the first line of the file
print(file:read())

-- closes the opened file
file:close()

-- Opens a file in append mode
file = io.open("test.lua", "a")

-- appends a word test to the last line of the file
file:write("--test")

-- closes the open file
file:close()

プログラムを実行すると、得られる暗黙の記述例は、出力と同様である。

コピーコード コードは以下の通りです。
-- Sample test.lua

外部記述を読み込むためのファイルオープンおよびパラメータは、暗示的なファイル記述子のすべてのパターンで同じです。

その他、ファイルに対する一般的なアプローチもあります。

  •     file:seek(オプションのwhence, オプションのoffset)。引数 "set"、"cur"、または "end"を指定します。ファイルを更新するために、ファイルの開始点から新しいファイルポインタの位置を設定します。この関数では、オフセットはゼロベースです。オフセットは、最初の引数が "set" の場合はファイルの先頭から、"cur" の場合はファイル内の現在の位置から、"end " の場合はファイルの終端から測定されます。デフォルトのパラメータ値は "cur" と 0 で、パラメータなしでこの関数を呼び出すと現在のファイル位置が得られます。
  •     file:flush()。デフォルトの出力バッファをクリアします。
  •     io.lines(オプションのファイル名): ファイルをトラバースする汎用ループイテレータを提供し、ファイル名とデフォルトファイルが提供され、ループの最後に閉じられない場合にファイルを閉じます。

カーソル位置の25手前からファイル末尾までオフセットする例です。ファイルからの読み出し関数は、残りのシーク位置を表示します。

コピーコード コードは以下の通りです。
-- Opens a file in read
file = io.open("test.lua", "r")

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

-- closes the opened file
file:close()

を実行すると、以下のような出力が得られます。

コピーコード コードは以下の通りです。
 sample2 test.lua
--test

Luaのファイル操作機能は、さまざまなモードとパラメータを使用して理解することができます。