Lua Academy · 강의

파일에 쓰고 내용 추가하기

파일에 문자열을 쓰고 기존 내용을 덮어쓰지 않고 데이터를 추가합니다.

레슨 3/412개 단계

파일에 쓰고 내용 추가하기은(는) 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")
end

io.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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. io.open으로 파일 열기
  2. 파일 내용 읽기
  3. 파일에 쓰고 내용 추가하기
  4. 파일 닫기와 오류 처리
← Lua Academy(으)로 돌아가기