파일에 쓰고 내용 추가하기
파일에 문자열을 쓰고 기존 내용을 덮어쓰지 않고 데이터를 추가합니다.
파일에 쓰고 내용 추가하기은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 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()빠른 확인
io.open에서 "w" 모드와 "a" 모드는 어떻게 다릅니까?
복습: 파일 쓰기
요약:
f:write(...)— 문자열/숫자 쓰기, 줄 바꿈은 자동 추가되지 않음"w"는 기존 내용을 지우고,"a"는 뒤에 추가f:flush()는 버퍼를 디스크에 기록io.write()는 기본 출력(stdout)에 씀- 원자적 쓰기: 임시 파일에 쓴 후 이름 변경
- 실제 서비스 코드에서는 쓰기 반환 값을 확인
AI 튜터와 함께 Lua을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 40
- 레슨
- 159
자주 묻는 질문
“파일에 쓰고 내용 추가하기” 강의는 무료인가요?
네 — “파일에 쓰고 내용 추가하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“파일에 쓰고 내용 추가하기”에서 뭘 배우나요?
파일에 문자열을 쓰고 기존 내용을 덮어쓰지 않고 데이터를 추가합니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Lua Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“파일에 쓰고 내용 추가하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- io.open으로 파일 열기
- 파일 내용 읽기
- 파일에 쓰고 내용 추가하기
- 파일 닫기와 오류 처리