Запись и добавление в файлы
Записывайте строки в файлы и добавляйте данные без перезаписи.
«Запись и добавление в файлы» — бесплатный урок 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")
endio.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 — локальная установка не требуется.
Все уроки этого курса
- Открытие файлов с io.open
- Чтение содержимого файлов
- Запись и добавление в файлы
- Закрытие файлов и обработка ошибок