0Pricing
Lua Academy · Урок

Открытие файлов с 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 — локальная установка не требуется.

Все уроки этого курса

  1. Открытие файлов с io.open
  2. Чтение содержимого файлов
  3. Запись и добавление в файлы
  4. Закрытие файлов и обработка ошибок
← Назад к Lua Academy