English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Lua 파일 I/O

Lua I/O 라이브러리는 파일을 읽고 처리하는 데 사용됩니다. 기본 모드(와 C와 같이)와 완전 모드로 구분됩니다.

  • 기본 모드(simple model)는 현재 입력 파일과 현재 출력 파일을 가지고 있으며, 이러한 파일과 관련된 작업을 제공합니다.

  • 완전 모드(complete model)는 외부 파일 핸들러를 사용하여 구현됩니다. 모든 파일 작업을 파일 핸들러 메서드로 정의하여 대상이 객체적인 형태로 제공됩니다

기본 모드는 간단한 파일 작업을 할 때 적합하지만, 고급 파일 작업을 할 때는 능력이 부족합니다. 예를 들어 여러 파일을 동시에 읽는 작업 같은 경우, 완전 모드를 사용하는 것이 적합합니다.

파일 열기 명령어는 다음과 같습니다:

file = io.open(filename[, mode])

mode 값은 다음과 같습니다:

모드설명
r읽기 모드로 파일을 열면, 파일이 반드시 존재해야 합니다.
w쓰기 모드로 파일을 열면, 파일이 존재하면 파일 길이가 0으로 초기화되어 파일 내용이 사라집니다. 파일이 존재하지 않으면 파일을 생성합니다.
a추가 모드로만 쓰기 파일을 열면, 파일이 존재하지 않으면 파일을 생성합니다. 파일이 존재하면 입력 데이터가 파일 끝에 추가되어 파일의 원래 내용이 유지됩니다. (EOF 기호 유지)
r+읽고 쓰기 모드로 파일을 열면, 파일이 반드시 존재해야 합니다.
w+읽고 쓰기 모드로 파일을 열면, 파일이 존재하면 파일 길이가 0으로 초기화되어 파일 내용이 사라집니다. 파일이 존재하지 않으면 파일을 생성합니다.
a+a와 유사하지만 이 파일은 읽고 쓸 수 있습니다
b이진 모드, 파일이 이진 파일이면 b
+호는 파일을 읽고 쓸 수 있는 파일을 나타냅니다

기본 모드

기본 모드는 표준 I/O 또는 현재 입력 파일과 현재 출력 파일을 사용할 수 있습니다.

아래는 file.lua 파일 코드입니다. 처리할 파일은 test.lua입니다(필요한 경우 파일을 생성해야 합니다). 코드는 다음과 같습니다:

-- 읽기 모드로 파일을 엽니다
file = io.open("test.lua", "r")
-- 기본 입력 파일을 test.lua로 설정
io.input(file)
-- 파일 첫 번째 행 출력
print(io.read())
-- 열린 파일을 닫습니다
io.close(file)
-- 추가 모드로 파일을 열기
file = io.open("test.lua", "a")
-- 기본 출력 파일을 test.lua로 설정
io.output(file)
-- 파일 마지막 행에 Lua 주석 추가
io.write("--  test.lua 파일 끝 주석")
-- 열린 파일을 닫습니다
io.close(file)

위 코드를 실행하면, test.lua 파일의 첫 번째 행 정보가 출력되고, 파일 마지막 행에 lua의 주석이 추가된 것을 발견할 수 있습니다. 저의 경우는 다음과 같이 출력됩니다:

-- test.lua 파일

위 예제에서 io."x" 메서드를 사용했습니다. io.read()에서 매개변수를 추가하지 않았습니다. 매개변수는 다음 테이블 중 하나입니다:

모드설명
"*n"숫자를 읽어서 반환합니다. 예를 들어, file.read("*n")
"*a"현재 위치에서 전체 파일을 읽습니다. 예를 들어, file.read("*a")
"*l"(기본)다음 행을 읽습니다. EOF에서 nil을 반환합니다. 예를 들어, file.read("*l")
number지정된 문자 수의 문자열을 반환하거나 EOF에서 nil을 반환합니다. 예를 들어, file.read("5)

기타 io 메서드는 다음과 같습니다:

  • io.tmpfile():업데이트 모드로 열린 일시적인 파일 핸들을 반환하며, 프로그램이 끝나면 자동으로 지워집니다

  • io.type(file): obj가 사용 가능한 파일 핸들인지 확인

  • io.flush(): 버퍼에 있는 모든 데이터를 파일에 씁니다

  • io.lines(선택 사항 파일 이름): 이터레이션 함수를 반환하며, 각 호출마다 파일의 한 행을 얻습니다. 파일 끝에 도달하면 nil을 반환하지만 파일을 닫지 않습니다

완전 모드

일반적으로 여러 파일을 동시에 처리해야 합니다. io.function_name 메서드 대신 file:function_name을 사용해야 합니다. 다음 예제는 동시에 같은 파일을 처리하는 방법을 보여줍니다:

-- 읽기 모드로 파일을 엽니다
file = io.open("test.lua", "r")
-- 파일 첫 번째 행 출력
print(file:read())
-- 열린 파일을 닫습니다
file:close()
-- 추가 모드로 파일을 열기
file = io.open("test.lua", "a")
-- 파일 마지막 행에 Lua 주석 추가
file:write("--test")
-- 열린 파일을 닫습니다
file:close()

위 코드를 실행하면, test.ua 파일의 첫 번째 행 정보가 출력되고, 파일 마지막 행에 lua의 주석이 추가된 것을 발견할 수 있습니다. 저의 경우는 다음과 같이 출력됩니다:

-- test.lua 파일

read의 매개변수는 간단 모드와 일치합니다.

其他方法:

  • file:seek(선택 사항 whence, 선택 사항 offset): 현재 파일 위치를 설정하고 가져옵니다, 성공하면 최종 파일 위치(바이트 단위)를 반환합니다, 실패하면 nil과 오류 메시지를 반환합니다. 매개변수 whence의 값은 다음과 같습니다:

    선택 사항 없이 file:seek()는 현재 위치를 반환합니다, file:seek("set")는 파일 시작으로 위치를 설정합니다, file:seek("end")는 파일 끝으로 위치를 설정하고 파일 크기를 반환합니다

    • "set": 파일 시작에서 시작

    • "cur": 현재 위치에서 시작[기본]

    • "end": 파일 끝에서 시작

    • offset: 기본值为0

  • file:flush(): 버퍼에 있는 모든 데이터를 파일에 씁니다

  • io.lines(선택 사항 파일 이름): 지정된 파일 filename을 읽기 모드로 열고 이터레이션 함수를 반환합니다. 매번 호출할 때마다 파일의 한 행을 얻습니다. 파일의 마지막에 도달하면 nil을 반환하고 자동으로 파일을 닫습니다.
    매개변수가 없을 때 io.lines() io.input():lines(); 기본 입력 장치의 내용을 읽습니다. 파일을 닫지 않습니다. 예를 들어:

    for line in io.lines("main.lua") do
      print(line)
      end

다음 예제는 seek 메서드를 사용하여 파일 뒤쪽으로 25 위치에서 read 메서드를 사용하여 *a 매개변수, 즉 현재 위치(뒤쪽으로) 25 위치에서 전체 파일을 읽습니다。

-- 읽기 모드로 파일을 엽니다
file = io.open("test.lua", "r")
file:seek("end",-25)
print(file:read("*a"))
-- 열린 파일을 닫습니다
file:close()

저의 출력 결과는:

st.lua 파일 끝--test