Lua 파일 I/O


파일 읽기 및 처리를 위한 Lua I/O 라이브러리입니다. 단순모드(C와 동일)와 완전모드로 나누어진다.

  • 간단 모델은 현재 입력 파일과 현재 출력 파일을 갖고 있으며 이들 파일과 관련된 연산을 제공합니다.

  • 완전한 모델은 외부 파일 핸들을 사용하여 구현됩니다. 모든 파일 작업을 객체 지향 형식의 파일 처리 메서드로 정의합니다.

간단한 파일 작업을 수행할 때는 단순 모드가 더 적합합니다. 하지만 일부 고급 파일 작업을 수행할 때 단순 모드는 부적절한 것 같습니다. 예를 들어 동시에 여러 파일을 읽는 등의 작업에는 전체 모드를 사용하는 것이 더 적합합니다.

파일 열기 연산문은 다음과 같습니다.

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

mode 값은

模式描述
r以只读方式打开文件,该文件必须存在。
w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
r+以可读写方式打开文件,该文件必须存在。
w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
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.ua 파일의 첫 번째 정보 줄이 변경되고 파일의 마지막 줄에 lua 주석이 추가되는 것을 확인할 수 있습니다. 예를 들어 출력은 다음과 같습니다.

-- test.lua 文件

위의 예에서는 io.read()에서 매개변수를 사용하지 않은 io."x" 메서드를 사용했습니다. 매개변수는 다음 중 하나일 수 있습니다. 다음 테이블:

模式描述
"*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 文件

읽기 매개변수는 단순 모드와 일치합니다.

다른 방법:

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

    매개변수 없이 file:seek()는 현재 위치를 반환하고, file:seek("set")은 파일 헤더를 찾고, file:seek("end")는 끝을 찾습니다. 파일 크기를 반환하고

    • "set": 파일의 처음부터 시작

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

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

    • offset: 기본값은 0

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

  • io.lines(선택적 파일 이름): 지정된 파일 filename을 읽기 모드로 열고 반복 함수를 반환합니다. 각 호출은 파일의 끝에 도달하면 파일의 내용 한 줄을 얻습니다. 반환되고 파일이 자동으로 닫힙니다.
    매개변수가 사용되지 않으면 io.lines() <=> io.input():lines();

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

다음 예에서는 탐색 방법을 사용하여 파일의 아래쪽에서 25번째 위치를 찾고 읽기 방법의 *a 매개 변수를 사용합니다. 현재 위치(아래에서 25번째 위치)

-- 以只读方式打开文件
file = io.open("test.lua", "r")

file:seek("end",-25)
print(file:read("*a"))

-- 关闭打开的文件
file:close()

여기의 출력 결과는 다음과 같습니다.

st.lua 文件末尾--test