Lua Academy · Урок

Запись и добавление в файлы

Записывайте строки в файлы и добавляйте данные без перезаписи.

Урок 3 из 412 шагов

«Запись и добавление в файлы» — бесплатный урок Lua Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Основы f:write()

f:write(...) записывает в файл одну или несколько строк (либо чисел). Переводы строк автоматически не добавляются. При успехе возвращается дескриптор файла, что позволяет объединять вызовы в цепочку; при ошибке возвращаются nil, errMessage, errCode.

local f = io.open("output.txt", "w")
if f then
  f:write("Hello, ")
  f:write("World")
  f:write("!\n")
  f:write("Line 2\n")
  f:close()
end

Запись нескольких значений

f:write() принимает несколько аргументов и последовательно записывает их все. Значения должны быть строками или числами — передача значений других типов вызывает ошибку. Используйте tostring(), чтобы преобразовать логические значения, таблицы и другие объекты.

local f = io.open("log.txt", "w")
f:write("Name: ", "Alice", "\n")
f:write("Age: ", 30, "\n")
f:write("Score: ", string.format("%.1f", 95.5), "\n")
f:close()

Форматированная запись

Сочетайте string.format и f:write для точного управления выводом. Этот приём часто используется для создания отчётов, журналов и экспорта данных с заданными требованиями к форматированию.

local data = {
  {name="Alice", score=95, grade="A"},
  {name="Bob",   score=87, grade="B"},
}

local f = io.open("report.txt", "w")
f:write(string.format("%-12s  %5s  %s\n","Name","Score","Grade"))
f:write(string.rep("-",25) .. "\n")
for _, r in ipairs(data) do
  f:write(string.format("%-12s  %5d  %s\n",r.name,r.score,r.grade))
end
f:close()

Режим добавления

Режим "a" всегда записывает данные в конец файла. Позиция для чтения находится в начале, но запись всегда выполняется в конец. Используйте этот режим для журналов, аудиторских записей и любых файлов, в которые нужно добавлять данные, не стирая содержимое.

local function appendLog(msg)
  local f = io.open("app.log", "a")
  if f then
    local ts = os.date("%Y-%m-%d %H:%M:%S")
    f:write(string.format("[%s] %s\n", ts, msg))
    f:close()
  end
end

appendLog("Server started")
appendLog("User logged in: Alice")
appendLog("Request processed")

f:flush() и буферизация

Файловый ввод-вывод в Lua буферизуется. Данные, записанные с помощью f:write(), могут некоторое время оставаться в буфере, прежде чем попасть на диск. f:flush() принудительно записывает буфер на диск, не закрывая файл. Обязательно вызывайте эту функцию до того, как данные должны стать доступными другому процессу.

local f = io.open("stream.txt", "w")
for i = 1, 5 do
  f:write("Line " .. i .. "\n")
  f:flush()   -- ensure each line is on disk
  -- simulate work
end
f:close()

Запись двоичных данных

В режиме двоичной записи ("wb") записывайте необработанные байты с помощью string.char(). Так создаются двоичные форматы файлов, изображения и сообщения протоколов. Для структурированных двоичных данных используйте string.pack (начиная с Lua 5.3).

local f = io.open("bytes.bin", "wb")
if f then
  -- Write raw bytes
  f:write(string.char(0xFF, 0x00, 0xAB, 0xCD))
  -- Write a 4-byte little-endian integer (Lua 5.3+)
  f:write(string.pack("<I4", 12345))
  f:close()
  print("Written binary file")
end

io.write и f:write

io.write() записывает данные в текущий вывод по умолчанию, первоначально stdout. f:write() записывает данные в дескриптор конкретного файла. В отличие от print(), ни одна из этих функций не добавляет перевод строки или разделители-табуляции, поэтому форматирование вывода полностью под вашим контролем.

-- io.write to stdout
io.write("Enter name: ")
-- (would read input here)

-- f:write to file
local f = io.open("out.txt", "w")
f:write("No auto newline")
f:write(" appended directly")
f:write("\n")  -- explicit newline
f:close()

-- print adds tabs and newline automatically
print("a", "b", "c")   -- a  b  c (tab-separated)

Шаблон атомарной записи

Для безопасности сначала записывайте данные во временный файл, а затем переименовывайте его. Это устраняет период, в течение которого выходной файл содержит только часть данных. Если процесс завершится с ошибкой во время записи, исходный файл останется неизменным.

local function atomicWrite(path, content)
  local tmp = path .. ".tmp"
  local f, err = io.open(tmp, "w")
  if not f then return nil, err end
  f:write(content)
  f:close()
  -- os.rename is atomic on most filesystems
  local ok, err2 = os.rename(tmp, path)
  if not ok then
    os.remove(tmp)
    return nil, err2
  end
  return true
end

Запись таблиц в формате CSV

Сериализуйте таблицу записей в формат CSV: запишите строку заголовков, затем по одной строке для каждой записи, преобразуя все значения в строки и объединяя их запятыми.

local function writeCSV(path, headers, rows)
  local f = io.open(path, "w")
  if not f then return end
  f:write(table.concat(headers, ",") .. "\n")
  for _, row in ipairs(rows) do
    local fields = {}
    for _, h in ipairs(headers) do
      fields[#fields+1] = tostring(row[h] or "")
    end
    f:write(table.concat(fields, ",") .. "\n")
  end
  f:close()
end

writeCSV("data.csv",
  {"name","age","score"},
  {{name="Alice",age=30,score=95},{name="Bob",age=25,score=87}}
)

Возвращаемое значение f:write

f:write() при успехе возвращает дескриптор файла, что позволяет объединять вызовы методов в цепочку. При ошибке функция возвращает nil, сообщение об ошибке и код ошибки. В рабочем коде всегда проверяйте ошибки, особенно при записи в системах с ограниченным объёмом хранилища.

local f = io.open("out.txt", "w")

-- Chaining writes
local ok, err = f:write("line1\n"):write("line2\n"):write("line3\n")
if not ok then
  print("Write failed:", err)
else
  print("All writes succeeded")
end
f:close()

Быстрая проверка

В чём разница между режимами "w" и "a" в io.open?

Повторение: запись файлов

Краткое резюме:

  • f:write(...) — запись строк и чисел без автоматического перевода строки
  • "w" очищает файл, а "a" добавляет данные в конец
  • f:flush() принудительно записывает буфер на диск
  • io.write() записывает данные в вывод по умолчанию (stdout)
  • Атомарная запись: записать во временный файл, затем переименовать его
  • В рабочем коде проверяйте возвращаемые значения операций записи
Можно начать бесплатно

Изучай Lua с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
40
Уроки
159

Часто задаваемые вопросы

Урок «Запись и добавление в файлы» бесплатный?

Да — полный текст урока «Запись и добавление в файлы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Запись и добавление в файлы»?

Записывайте строки в файлы и добавляйте данные без перезаписи. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Запись и добавление в файлы»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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