Læsning af filindhold
Læs linjer, bytes og hele filindholdet med file:read()-metoder.
Læsning af filindhold er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.
Læs hele filen
Brug f:read("a") (eller "*a") til at læse hele filen ind i en streng. Det er enkelt og fungerer fint for små og mellemstore filer. For meget store filer bør du læse i blokke eller linje for linje for at undgå problemer med hukommelsen.
local f = io.open("config.txt", "r")
if f then
local content = f:read("a")
f:close()
print("Size:", #content, "bytes")
print(content)
endLæs linje for linje
f:read("l") læser den næste linje og fjerner linjeskiftet. Returnerer nil ved EOF. Brug while til at behandle hver linje. f:lines() er den idiomatiske kortform, der gør det samme.
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) endLæs et fast antal byte
Giv et tal til f:read(n) for at læse præcis n byte. Returnerer en streng med op til n byte (færre, hvis EOF nås) eller nil ved EOF. Brug det til binære protokoller eller strukturerede filformater.
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()
endLæs et tal
f:read("n") læser det næste tal fra filen og springer mellemrum over. Returnerer et Lua-tal eller nil, hvis det næste token ikke er et tal. Det er nyttigt til læsning af strukturerede datafiler med tal.
-- 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)
endSøgning i filer
f:seek(whence, offset) flytter filpositionen. whence er "set" (fra begyndelsen), "cur" (fra den aktuelle position) eller "end" (fra slutningen). Returnerer den nye absolutte position. Brug det til at læse dele igen eller springe rundt i filer.
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()
endLæsning af CSV-filer
Analysér CSV-data linje for linje: læs hver linje, og opdel den derefter ved kommaer med string.gmatch. I produktionskode skal du håndtere citationstegn omkring felter og kommaer inde i citationstegn, men til simple data fungerer en grundlæggende opdeling.
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"}}Læsning af konfigurationsfiler
Et enkelt konfigurationsformat med nøgle=værdi: læs linje for linje, spring kommentarer og tomme linjer over, og analysér nøgle=værdi-par med 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)Blokvis læsning
For store filer skal du læse i blokke med fast størrelse for at undgå at indlæse alt i hukommelsen. Behandl hver blok, efterhånden som den ankommer. Det er afgørende for filer, der er større end den tilgængelige RAM.
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
endLæsning af flere værdier pr. linje
Når hver linje indeholder flere værdier adskilt af mellemrum eller tabulatorer, kan du bruge string.match eller string.gmatch til at udtrække dem. Dette mønster håndterer simple strukturerede tekstfiler.
-- 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)
endGenvej med io.lines
io.lines(filename) åbner filen, returnerer en linjeiterator og lukker filen, når den er færdig. Det er den korteste måde at læse en fil linje for linje på uden eksplicit at administrere håndtaget.
-- 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)Hurtigt tjek
Hvad returnerer f:read("a"), når filmarkøren allerede står ved EOF?
Opsummering: Læsning af filer
Opsummering:
f:read("a")— hele filen som strengf:read("l")— én linje uden linjeskiftf:read(n)— præcis n bytef:read("n")— det næste talio.lines(path)— linjeiterator, lukker automatiskf:seek()— spring til en position
Lær Lua med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 40
- Lektioner
- 159
Ofte stillede spørgsmål
Er lektionen “Læsning af filindhold” gratis?
Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Læsning af filindhold”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Læsning af filindhold”?
Læs linjer, bytes og hele filindholdet med file:read()-metoder. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Lua Academy?
Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Læsning af filindhold”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Lua Academy-lektion?
Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Åbning af filer med io.open
- Læsning af filindhold
- Skrivning til og tilføjelse i filer
- Lukning af filer og fejlhåndtering