0Pricing
Lua Academy · Aula

Lendo o conteúdo de arquivos

Leia linhas, bytes e o conteúdo completo com os métodos file:read().

Lendo o conteúdo de arquivos é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 2 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.

Ler o Arquivo Inteiro

Use f:read("a") (ou "*a") para ler o arquivo inteiro em uma string. Isso é simples e adequado para arquivos pequenos ou médios. Para arquivos muito grandes, leia em blocos ou linha por linha para evitar problemas de memória.

local f = io.open("config.txt", "r")
if f then
  local content = f:read("a")
  f:close()
  print("Size:", #content, "bytes")
  print(content)
end

Ler Linha por Linha

f:read("l") lê a próxima linha, removendo a quebra de linha. Retorna nil em EOF. Use um laço com while para processar cada linha. f:lines() é a forma abreviada idiomática que faz a mesma coisa.

local f = io.open("data.txt", "r")
if f then
  local line = f:read("l")
  while line ~= nil do
    print(line)
    line = f:read("l")
  end
  f:close()
end

-- Equivalent with for loop:
-- for line in io.lines("data.txt") do print(line) end

Ler uma Quantidade Fixa de Bytes

Passe um número para f:read(n) a fim de ler exatamente n bytes. Retorna uma string com até n bytes (menos se EOF for alcançado) ou nil em EOF. Use isso para protocolos binários ou formatos de arquivo estruturados.

local f = io.open("binary.dat", "rb")
if f then
  -- Read 4-byte header
  local header = f:read(4)
  if header then
    print("Header bytes:", #header)
    for i = 1, #header do
      io.write(string.format("%02X ", header:byte(i)))
    end
    print()
  end
  f:close()
end

Ler um Número

f:read("n") lê o próximo número do arquivo, ignorando espaços em branco. Retorna um número Lua ou nil se o próximo token não for um número. É útil para ler arquivos de dados numéricos estruturados.

-- File contains: "10 20 30.5 40"
local f = io.open("nums.txt", "r")
if f then
  local total = 0
  local n = f:read("n")
  while n do
    total = total + n
    n = f:read("n")
  end
  f:close()
  print("Sum:", total)
end

Navegar em Arquivos

f:seek(whence, offset) move a posição no arquivo. whence é "set" (a partir do início), "cur" (a partir da posição atual) ou "end" (a partir do fim). Retorna a nova posição absoluta. Use isso para reler ou saltar entre partes dos arquivos.

local f = io.open("test.txt", "r")
if f then
  -- Jump to end, get file size
  local size = f:seek("end")
  print("File size:", size, "bytes")
  
  -- Seek back to start
  f:seek("set", 0)
  local first_line = f:read("l")
  print("First line:", first_line)
  f:close()
end

Ler Arquivos CSV

Analise dados CSV linha por linha: leia cada linha e depois divida-a pelas vírgulas usando string.gmatch. Em código de produção, trate campos entre aspas e vírgulas dentro das aspas; para dados simples, a divisão básica funciona.

local function parseCSV(path)
  local rows = {}
  for line in io.lines(path) do
    local row = {}
    for field in string.gmatch(line, "([^,]+)") do
      row[#row+1] = field
    end
    rows[#rows+1] = row
  end
  return rows
end

-- Example: "Alice,30,Engineer"
-- => {{"Alice","30","Engineer"}}

Ler Arquivos de Configuração

Um formato simples de configuração chave=valor: leia linha por linha, ignore comentários e linhas em branco e analise os pares chave=valor com string.match.

local function loadConfig(path)
  local cfg = {}
  for line in io.lines(path) do
    -- Skip comments and blank lines
    if not line:match("^%s*#") and line:match("%S") then
      local k, v = line:match("^%s*(%w+)%s*=%s*(.-)%s*$")
      if k then cfg[k] = v end
    end
  end
  return cfg
end

local config = loadConfig("app.conf")
print(config.host, config.port)

Leitura em Blocos

Para arquivos grandes, leia em blocos de tamanho fixo para evitar carregar tudo na memória. Processe cada bloco à medida que ele chega. Isso é essencial para arquivos maiores que a RAM disponível.

local function processLarge(path, chunkSize)
  chunkSize = chunkSize or 4096
  local f, err = io.open(path, "rb")
  if not f then return nil, err end
  local totalBytes = 0
  local chunk = f:read(chunkSize)
  while chunk do
    totalBytes = totalBytes + #chunk
    -- process chunk here
    chunk = f:read(chunkSize)
  end
  f:close()
  return totalBytes
end

Ler Vários Valores por Linha

Quando cada linha contém vários valores separados por espaços ou tabulações, use string.match ou string.gmatch para extraí-los. Esse padrão trata arquivos de texto estruturados simples.

-- File: "Alice 95 A\nBob 87 B"
local results = {}
for line in io.lines("grades.txt") do
  local name, score, grade = line:match("(%S+)%s+(%d+)%s+(%S+)")
  if name then
    results[#results+1] = {
      name=name,
      score=tonumber(score),
      grade=grade
    }
  end
end

for _, r in ipairs(results) do
  print(r.name, r.score, r.grade)
end

Atalho io.lines

io.lines(filename) abre o arquivo, retorna um iterador de linhas e fecha o arquivo ao terminar. É a forma mais concisa de ler um arquivo linha por linha sem gerenciar explicitamente o identificador.

-- Count non-empty lines
local count = 0
for line in io.lines("data.txt") do
  if line:match("%S") then
    count = count + 1
  end
end
print("Non-empty lines:", count)

-- Collect all lines into a table
local lines = {}
for line in io.lines("data.txt") do
  lines[#lines+1] = line
end
print("Total lines:", #lines)

Verificação Rápida

O que f:read("a") retorna quando o ponteiro do arquivo já está em EOF?

Recapitulação: Lendo Arquivos

Resumo:

  • f:read("a") — arquivo inteiro como string
  • f:read("l") — uma linha, sem quebra de linha
  • f:read(n) — exatamente n bytes
  • f:read("n") — próximo número
  • io.lines(path) — iterador de linhas, fecha automaticamente
  • f:seek() — salta para uma posição

Perguntas Frequentes

A aula “Lendo o conteúdo de arquivos” é grátis?

Sim — o texto completo de “Lendo o conteúdo de 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 “Lendo o conteúdo de arquivos”?

Leia linhas, bytes e o conteúdo completo com os métodos file:read(). 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 2 de 4.

Quanto tempo leva a aula “Lendo o conteúdo de 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