Escrevendo e acrescentando em arquivos
Escreva cadeias em arquivos e acrescente dados sem sobrescrever o conteúdo existente.
Escrevendo e acrescentando em arquivos é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.
Fundamentos de f:write()
f:write(...) escreve uma ou mais strings (ou números) no arquivo. Ele não adiciona quebras de linha automaticamente. Retorna o identificador do arquivo em caso de sucesso (permitindo encadeamento) ou nil, errMessage, errCode em caso de falha.
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()
endEscrever Vários Valores
f:write() aceita vários argumentos e escreve todos sequencialmente. Os valores devem ser strings ou números — passar outros tipos gera um erro. Use tostring() para converter valores booleanos, tabelas etc.
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()Escrita Formatada
Combine string.format com f:write para obter uma saída precisa. Esse padrão é comum na geração de relatórios, arquivos de registro e exportações de dados com requisitos específicos de formatação.
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()Modo de Anexação
O modo "a" sempre escreve no final do arquivo. A posição do arquivo para leituras fica no início, mas as escritas sempre vão para o final. Use-o para registros, trilhas de auditoria e qualquer arquivo ao qual queira adicionar conteúdo sem apagar o que já existe.
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() e Armazenamento em Buffer
A entrada e saída de arquivos em Lua usa armazenamento em buffer. Os dados escritos com f:write() podem permanecer em um buffer antes de chegar ao disco. f:flush() força a gravação do buffer no disco sem fechar o arquivo. Sempre descarregue o buffer antes de precisar que outro processo veja os dados.
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()Escrever Dados Binários
No modo de escrita binária ("wb"), escreva bytes brutos com string.char(). É assim que se criam formatos de arquivos binários, imagens ou mensagens de protocolos. Use string.pack (Lua 5.3+) para dados binários estruturados.
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 versus f:write
io.write() escreve na saída padrão atual (inicialmente stdout). f:write() escreve em um identificador de arquivo específico. Ao contrário de print(), nenhum dos dois adiciona quebra de linha ou separadores de tabulação, dando-lhe controle total sobre a formatação da saída.
-- 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)Padrão de Escrita Atômica
Por segurança, escreva em um arquivo temporário e depois renomeie-o. Isso evita um intervalo em que o arquivo de saída fica parcialmente escrito. Se o processo falhar durante a escrita, o arquivo original permanecerá intacto.
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
endEscrever Tabelas como CSV
Serialize uma tabela de registros no formato CSV: escreva uma linha de cabeçalho e depois uma linha por registro, convertendo todos os valores em strings e unindo-os com vírgulas.
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}}
)Valor de Retorno de f:write
f:write() retorna o identificador do arquivo em caso de sucesso, permitindo o encadeamento de métodos. Em caso de falha, retorna nil, uma mensagem de erro e um código de erro. Sempre verifique os erros no código de produção, especialmente em operações de escrita em sistemas com armazenamento limitado.
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()Verificação Rápida
Qual é a diferença entre os modos "w" e "a" em io.open?
Recapitulação: Escrevendo Arquivos
Resumo:
f:write(...)— escreve strings/números; não adiciona quebra de linha automaticamente"w"trunca,"a"anexaf:flush()força a gravação do buffer no discoio.write()escreve na saída padrão (stdout)- Escrita atômica: escreva em um arquivo temporário e depois renomeie-o
- Verifique os valores de retorno das escritas no código de produção
Perguntas Frequentes
A aula “Escrevendo e acrescentando em arquivos” é grátis?
Sim — o texto completo de “Escrevendo e acrescentando em arquivos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.
O que vou aprender em “Escrevendo e acrescentando em arquivos”?
Escreva cadeias em arquivos e acrescente dados sem sobrescrever o conteúdo existente. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Lua Academy?
Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Escrevendo e acrescentando em arquivos”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Lua Academy?
Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Abrindo arquivos com io.open
- Lendo o conteúdo de arquivos
- Escrevendo e acrescentando em arquivos
- Fechando arquivos e tratando erros