0Pricing
Lua Academy · レッスン

io.openによるファイルのオープン

io.openを使い、読み込み・書き込み・追記モードでファイルを開きます。

「io.openによるファイルのオープン」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

io.openの構文

io.open(filename, mode)はファイルを開いてファイルハンドルを返します。失敗した場合は、nilとエラーメッセージを返します。モード文字列:"r"は読み取り(デフォルト)、"w"は書き込み(内容を切り詰める)、"a"は追記、"r+"は読み書き、"b"はバイナリ用の接尾辞です。

local f, err = io.open("test.txt", "w")
if not f then
  print("Error:", err)
  return
end
f:write("Hello, Lua!\n")
f:close()
print("Written successfully")

読み取りモード

既存のファイルを読み取るには、"r"モードで開きます。必ずnilかどうかを確認してください。ファイルが存在しない場合、io.openはnilとエラーメッセージを返します。ファイルが存在すると決めつけないでください。

local f, err = io.open("test.txt", "r")
if not f then
  print("Cannot open:", err)
  return
end
local content = f:read("*a")  -- read all
f:close()
print(content)

書き込みモードと追記モード

"w"はファイルを作成するか、内容を切り詰めます。"a"は必要に応じてファイルを作成し、常に末尾に追記します。以前の内容を失いたくないログファイルには、追記モードを使用してください。

-- Write (creates/truncates)
local f = io.open("log.txt", "w")
f:write("Session started\n")
f:close()

-- Append (adds to end)
local g = io.open("log.txt", "a")
g:write("Event: login\n")
g:write("Event: action\n")
g:close()

バイナリモード

任意のモードに"b"を追加すると、バイナリ形式で読み書きできます。Unixではテキストモードとバイナリモードに違いはありません。Windowsでは、テキストモードが\nを\r\nに変換しますが、バイナリモードではこの変換が無効になります。テキスト以外のファイルには、必ずバイナリモードを使用してください。

-- Binary read
local f = io.open("image.png", "rb")
if f then
  local header = f:read(8)   -- read 8 bytes
  f:close()
  -- Check PNG magic number: \137PNG\r\n\26\n
  print("Read", #header, "bytes")
end

-- Binary write
local g = io.open("out.bin", "wb")
if g then
  g:write(string.char(0x89, 0x50, 0x4E, 0x47))
  g:close()
end

ファイルハンドルのメソッド

io.openが返すファイルハンドルには、f:read(...)、f:write(...)、f:lines()、f:seek(whence, offset)、f:flush()、f:close()などのメソッドがあります。ハンドルに対してコロン構文で呼び出してください。

local f = io.open("data.txt", "w")
f:write("line 1\n")
f:write("line 2\n")
f:write("line 3\n")
f:flush()   -- force write to disk
f:close()

local g = io.open("data.txt", "r")
for line in g:lines() do
  print(line)
end
g:close()

io.input と io.output

io.input(f)はデフォルトの入力ファイルを設定し、io.output(f)はデフォルトの出力ファイルを設定します。io.read()は現在の入力から読み取り、io.write()は現在の出力に書き込みます。デフォルトの入力はstdin、デフォルトの出力はstdoutです。

-- Read from stdin (default input)
local line = io.read()  -- reads one line
print("You entered:", line)

-- Set default output to a file
io.output("out.txt")
io.write("This goes to out.txt\n")
io.output(io.stdout)  -- restore stdout

ファイルの存在確認

Luaにはfile.exists()はありませんが、読み取りモードでio.openを使用できます。失敗した場合、そのファイルは存在しないか、アクセスできません。代わりに、POSIXシステムではos.executeまたはlfsライブラリを使用できます。

local function fileExists(path)
  local f = io.open(path, "r")
  if f then f:close(); return true end
  return false
end

print(fileExists("test.txt"))     -- true/false
print(fileExists("noexist.txt"))  -- false

モードを指定した読み取り

f:read()はフォーマット文字列を受け取ります。"l"または"*l"は改行を除いた1行を読み取り、"L"は改行を保持します。"n"は数値を読み取り、"a"または"*a"はEOFまで読み取ります。数値を指定すると、そのバイト数を読み取ります。

local f = io.open("data.txt", "r")
if f then
  local line1 = f:read("l")   -- first line, no newline
  local num   = f:read("n")   -- next number in file
  local rest  = f:read("a")   -- rest of file
  f:close()
  print(type(line1), type(num))
end

一時ファイル

io.tmpfile()は、読み書きモードで一時ファイルを開きます。ファイルはプログラムの終了時、またはハンドルがガベージコレクションの対象になったときに自動的に削除されます。ファイル名を管理せずに中間処理を行う場合に使用します。

local tmp = io.tmpfile()
tmp:write("temporary data\n")
tmp:write("more data\n")

-- Seek back to start and read
tmp:seek("set", 0)
local content = tmp:read("a")
print(content)
-- File auto-deleted when tmp is collected

lines()で行を反復処理する

f:lines()は、1行ずつ読み取るイテレーターを返します。イテレーターの処理が完了すると、ファイルは自動的に閉じられます。ファイル全体を一度に読み込まないため、大きなファイルでもメモリを効率的に使用できます。

local function countLines(path)
  local count = 0
  local f, err = io.open(path, "r")
  if not f then return nil, err end
  for _ in f:lines() do
    count = count + 1
  end
  -- f is closed automatically by lines()
  return count
end

local n, err = countLines("data.txt")
print("Lines:", n)

確認問題

ファイルが存在しない場合、io.open("file.txt", "a")は何をしますか?

復習: io.open

まとめ:

  • io.open(path, mode)はハンドル、またはnilとエラーを返します
  • モード: r w a r+ b
  • ハンドルを使用する前に、必ずnilかどうかを確認します
  • 使い終わったらf:close()を呼び出します
  • メモリ効率のよい行単位の反復処理にはf:lines()を使用します
  • 自動削除される一時ファイルにはio.tmpfile()を使用します

よくある質問

「io.openによるファイルのオープン」レッスンは無料ですか?

はい。「io.openによるファイルのオープン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「io.openによるファイルのオープン」で何を学びますか?

io.openを使い、読み込み・書き込み・追記モードでファイルを開きます。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「io.openによるファイルのオープン」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. io.openによるファイルのオープン
  2. ファイル内容の読み込み
  3. ファイルへの書き込みと追記
  4. ファイルのクローズとエラー処理
← Lua Academyに戻る