Открытие файлов с io.open
Открывайте файлы в режимах чтения, записи и добавления с помощью io.open.
«Открытие файлов с io.open» — бесплатный урок Lua Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения 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" считывает одну строку, удаляя перевод строки; "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() возвращает итератор, который считывает по одной строке за раз. После исчерпания итератора файл автоматически закрывается. Этот способ экономно расходует память при работе с большими файлами: весь файл не загружается целиком.
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/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Открытие файлов с io.open»?
Открывайте файлы в режимах чтения, записи и добавления с помощью io.open. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Открытие файлов с io.open»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Открытие файлов с io.open
- Чтение содержимого файлов
- Запись и добавление в файлы
- Закрытие файлов и обработка ошибок