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 collectedlines()で行を反復処理する
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- io.openによるファイルのオープン
- ファイル内容の読み込み
- ファイルへの書き込みと追記
- ファイルのクローズとエラー処理