0Pricing
Lua Academy · Aula

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()
end

Escrever 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")
end

io.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
end

Escrever 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" anexa
  • f:flush() força a gravação do buffer no disco
  • io.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

  1. Abrindo arquivos com io.open
  2. Lendo o conteúdo de arquivos
  3. Escrevendo e acrescentando em arquivos
  4. Fechando arquivos e tratando erros
← Voltar para Lua Academy