입출력 시설

입출력 시설 (Input and Output Facilities)

io 라이브러리는 입력/출력(I/O)을 다루는 함수를 제공해요. io 라이브러리는 세 종류의 스트림을 제공해요.

  • 파일(file): io.open으로 열린 파일.
  • 표준 스트림: 표준 입력(stdin), 표준 출력(stdout), 표준 오류(stderr) — io.input, io.output으로 설정 가능.
  • 임시 파일: io.tmpfile.

파일을 다루는 작업은 두 부류의 방식으로 가능해요.

  • 암시적 파일(implicit): io.input()/io.output()으로 설정된 "현재 입력/출력 파일"을 사용하는 io.read/io.write 같은 함수.
  • 명시적 파일(explicit): 특정 파일 객체(핸들)에 대해 file:read/file:write 같은 메서드를 호출하는 방식.

io.close

io.close ([file])

file을 닫아요. file이 없으면 기본 출력 파일(io.output)을 닫아요. 파일이 이미 닫혔으면 오류가 발생해요. 닫기 성공 시 true(또는 실패 시 nil·오류 메시지)를 반환해요.

io.flush

io.flush ()

기본 출력 파일(io.output)의 버퍼를 비워(flush) 실제 장치에 기록해요. 성공하면 true를 반환해요.

io.input

io.input ([file])

  • file이 없으면 현재 기본 입력 파일을 반환해요.
  • file이 문자열이면 그 이름의 파일을 텍스트 모드로 열어 기본 입력으로 설정해요.
  • file이 파일 객체면 그 파일을 기본 입력으로 설정해요.
  • 설정 후 해당 파일 객체를 반환해요.

io.lines

io.lines ([filename, ...])

파일 전체(또는 지정된 형식)를 줄 단위로 읽는 반복자 함수를 반환해요. 일반 for(for line in io.lines("file.txt"))에 쓰여요.

  • filename이 없으면 기본 입력 파일을 대상으로 하고, 파일을 닫지 않아요.
  • filename이 주어지면 파일을 열고, 반복이 끝나면 자동으로 닫아요.
  • 추가 인자(...)는 io.read/file:read의 형식 인자로 전달돼요 (예: io.lines(file, 100)은 100바이트 청크로 읽음).

io.open

io.open (filename [, mode])

filename의 파일을 열어 파일 객체를 반환해요. 열 수 없으면 nil과 오류 메시지(그리고 OS 관련 오류 코드)를 반환해요.

mode는 다음 조합 중 하나예요 (기본은 읽기 "r").

  • "r" — 읽기.
  • "w" — 쓰기 (덮어쓰기).
  • "a" — 이어쓰기(append).
  • "r+" — 읽기/쓰기.
  • "w+" — 읽기/쓰기 (덮어쓰기).
  • "a+" — 읽기/이어쓰기.
  • 각 모드에 "b"를 붙이면 이진(binary) 모드 ("rb", "wb" 등).
local f = assert(io.open("data.txt", "r"))

io.output

io.output ([file])

io.input과 대칭되는 함수예요. file이 없으면 현재 기본 출력 파일을 반환하고, 문자열이면 그 파일을 쓰기 모드로 열어 기본 출력으로, 파일 객체면 그대로 설정해요.

io.popen

io.popen (prog [, mode])

운영체제 셸 명령 prog를 실행하는 파이프를 열어요. mode"r"(기본)이면 명령 출력을 읽을 수 있는 파일을, "w"면 명령에 입력을 쓸 수 있는 파일을 반환해요. 실패하면 nil과 오류를 반환해요. 프로그램 종료 후 file:close로 종료 상태를 얻을 수 있어요. 이 함수는 플랫폼에 따라 제공되지 않을 수 있어요.

io.read

io.read (...)

기본 입력 파일에서 ... 형식에 따라 값을 읽어요. 형식 인자 목록은 file:read와 같아요. 읽을 것이 없으면 nil을 반환해요.

io.tmpfile

io.tmpfile ()

임시 파일을 만들어 쓰기/읽기 모드("w+")로 열고 그 파일 객체를 반환해요. 프로그램이 종료되거나 파일이 닫히면 자동으로 삭제돼요.

io.type

io.type (obj)

obj가 열린 파일 객체면 "file", 닫힌 파일 객체면 "closed file", 파일 객체가 아니면 nil을 반환해요.

io.write

io.write (...)

인자들을 기본 출력 파일에 씁니다. 각 인자는 문자열 또는 숫자여야 해요 (숫자는 문자열로 변환). 여러 인자를 공백 없이 순서대로 이어 써요. 성공하면 파일 객체를 반환해요.

io.write("이름: ", name, "\n")

file 메서드 (File methods)

파일 객체(f)에 대해 다음과 같은 메서드를 호출할 수 있어요.

file:close

file:close ()

파일을 닫아요. 성공 시 true, 실패 시 nil과 오류 메시지를 반환해요.

file:flush

file:flush ()

파일 버퍼를 비워 실제 장치에 기록해요. 성공 시 true를 반환해요.

file:lines

file:lines (...)

파일에서 줄(또는 지정 형식)을 읽는 반복자 함수를 반환해요. file을 대상으로 하고, 파일이 끝나면 반복이 끝나요. ...file:read의 형식 인자예요.

file:read

file:read (...)

파일에서 읽어요. 각 인자는 읽기 형식을 나타내는 문자 또는 숫자예요.

  • "n" — 다음 숫자를 읽어 반환 (숫자 아닌 문자는 건너뜀). 없으면 nil.
  • "a" — 파일의 나머지 전체를 읽어 반환.
  • "l" — 다음 줄을 읽어 반환 (\n 제외, 파일 끝이면 EOF). 행 구분자가 없이 EOF면 나머지를 반환. (기본값)
  • "L""l"과 같되 행 구분자(\n 또는 \r\n)를 유지.
  • 숫자 n — 정확히 n 바이트를 읽어 반환. n바이트를 다 읽지 못하면 nil(읽은 게 없음) 또는 짧은 문자열을 반환.
  • 인자가 없으면 "l"과 동일.
local line = f:read()          -- 한 줄 읽기
local all = f:read("a")        -- 나머지 전체 읽기
local num = f:read("n")        -- 숫자 읽기
local chunk = f:read(100)      -- 100바이트 읽기

file:seek

file:seek ([whence [, offset]])

파일의 현재 위치를 설정하고, 설정 후의 위치(파일 시작 기준 바이트)를 반환해요.

  • whence: "set"(시작부터, 기본), "cur"(현재 위치부터), "end"(파일 끝부터).
  • offset: 그 기준에서의 바이트 오프셋 (기본 0).
  • 예: f:seek("end")는 파일 크기를 반환하고 f:seek("set", 0)은 처음으로 이동.
local size = f:seek("end")     -- 파일 크기
f:seek("set", 0)               -- 처음으로

file:setvbuf

file:setvbuf (mode [, size])

파일 버퍼링 모드를 설정해요.

  • "no" — 버퍼 없음(즉시 쓰기).
  • "full" — 가득 차면 비움(전체 버퍼링).
  • "line" — 줄 단위로 비움(행 버퍼링).
  • size는 버퍼 크기(바이트).

file:write

file:write (...)

인자들을 파일에 씁니다. 각 인자는 문자열 또는 숫자여야 해요. 파일이 쓰기 모드로 열려 있어야 해요. 성공 시 파일 객체를 반환하고, 실패 시 오류를 내요.

f:write("hello\n")
f:write(42, "\n")

에러 처리 관례

io 라이브러리 함수들은 실패할 때 오류를 던지는 것(io.open 등은 nil 반환)과 nil/오류 메시지를 반환하는 것(file:read 등은 nil 반환)이 섞여 있어요. 실패 시 보통 nil과 오류 메시지(문자열), 그리고 (가능하면) OS 오류 코드(숫자)를 반환해요. 오류를 무시하고 싶으면 pcall로 감싸거나 assert로 확인할 수 있어요.

local f, err = io.open("nope.txt", "r")
if not f then print("오류:", err) end

출처: 입출력 시설 (Input and Output Facilities)

본문

파일 열기와 모드

io.openio.lines는 파일을 여는 주요 진입점이에요. 쓰기·이어쓰기·이진 모드를 지원하고, 파일 객체 메서드(file:read/file:write)로 읽고 씁니다.

표준 스트림

io.input()/io.output()으로 기본 스트림을 바꿀 수 있고, io.read/io.write는 그 기본 스트림을 대상으로 해요. stderr는 별도 스트림으로, 필요하면 직접 접근해요.

반복자

io.linesfile:lines는 메모리를 들이는 대신 파일을 줄 단위로 순회하는 효율적인 방법이에요.

더 알아보기