Lua ファイル I/O


ファイルの読み取りと処理のための Lua I/O ライブラリ。シンプルモード(Cと同じ)とコンプリートモードに分かれています。

  • 単純なモデルには現在の入力ファイルと現在の出力ファイルがあり、これらのファイルに関連する操作を提供します。

  • Complete モデル (完全なモデル) は、外部ファイル ハンドルを使用して実装されます。すべてのファイル操作をオブジェクト指向形式のファイル ハンドル メソッドとして定義します

シンプル モードは、いくつかの単純なファイル操作を実行する場合に適しています。ただし、高度なファイル操作を実行する場合には、シンプル モードでは不十分なようです。たとえば、複数のファイルを同時に読み取るような操作には、フル モードを使用する方が適しています。

開くファイル操作ステートメントは次のとおりです:

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

mode 値は次のとおりです:

モード 説明
r ファイルを読み取り専用モードで開きます。ファイルは存在する必要があります。
w 書き込み専用ファイルを開くと、ファイルが存在する場合、ファイル長は 0 にクリアされます。つまり、ファイルの内容は消去されます。ファイルが存在しない場合は、ファイルを作成します。
a書き込み専用ファイルを追加モードで開きます。ファイルが存在しない場合はファイルが作成され、ファイルが存在する場合は、書き込まれたデータがファイルの末尾に追加されます。つまり、ファイルの元の内容は保持されます。 (EOF 文字は予約されています)
r+ ファイルを読み取り/書き込みモードで開きます。 ファイルは存在する必要があります。
w+ 読み取りおよび書き込み可能なファイルを開きます。ファイルが存在する場合、ファイルの長さはゼロにクリアされます。つまり、ファイルの内容は消去されます。ファイルが存在しない場合は、ファイルを作成します。
a+はaに似ていますが、このファイルは
bバイナリモードで読み書きできます。ファイルがバイナリファイルの場合は、b
+を追加できます。ファイルが読み取りと書き込みの両方が可能であることを示します

シンプル モード

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

以下は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.ua ファイルの最初の部分は出力行情報であり、ファイルの最後の行に Lua コメントを追加していることがわかります。たとえば、ここでの出力は次のとおりです:

-- test.lua 文件

上の例では、io.read() でパラメータを取得しなかった io."x" メソッドを使用しました。パラメータは次のテーブルのいずれかになります。

モード説明
"*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(オプションのファイル名): 反復関数を返します、この呼び出しはファイルの終わりに達すると 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.ua ファイルの情報の最初の行が出力され、最後の行に lua コメントが追加されていることがわかります。ファイルの行。たとえば、ここでの出力は次のようになります:

-- test.lua 文件

read パラメータはシンプル モードと一致します。

その他のメソッド:

file:seek(optional whence、optional offset):

現在のファイル位置を設定および取得します。失敗した場合は、最終的なファイル位置 (バイト単位) が返されます。エラーメッセージが返されます。パラメーターの値は次のとおりです:
  • パラメーターがない場合、 file:seek() は現在位置を返し、 file:seek("set") はファイルの先頭を見つけ、 file:seek("end") はファイルの終わりを見つけます。ファイルサイズを返します

    "set": ファイルの先頭から開始

    • "cur": 現在位置から開始[デフォルト]

    • "end": ファイルの末尾から開始ファイル

    • オフセット: デフォルトは0です

    • file:flush():
    • バッファ内のすべてのデータをファイルに書き込みます
  • io.lines(オプションのファイル名):

    開く指定されたファイル filename を読み取りモードで呼び出して反復関数を返すと、各呼び出しでファイルの終わりに達すると、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