Lua File I/O

La librería I/O de Lua se utiliza para leer y procesar archivos. Se divide en modo simple (igual que C) y modo completo.

  • El modo simple (simple model) tiene un archivo de entrada actual y un archivo de salida actual, y proporciona operaciones relacionadas con estos archivos.
  • El modo completo (complete model) utiliza manejadores de archivo externos para implementarse. De forma orientada a objetos, define todas las operaciones de archivo como métodos del manejador de archivo.

El modo simple es adecuado para operaciones de archivo sencillas. Pero al realizar operaciones de archivo avanzadas, el modo simple resulta insuficiente. Por ejemplo, para operaciones como leer varios archivos a la vez, es más adecuado usar el modo completo.

La declaración para abrir un archivo es la siguiente:

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

Los valores de mode son:

ModoDescripción
rAbre el archivo en modo solo lectura; el archivo debe existir.
wAbre un archivo de solo escritura. Si el archivo existe, su longitud se borra a 0, es decir, el contenido del archivo desaparece. Si el archivo no existe, se crea.
aAbre un archivo de solo escritura en modo añadir. Si el archivo no existe, se crea; si existe, los datos escritos se añaden al final del archivo, es decir, el contenido original del archivo se conserva. (Se conserva el marcador EOF).
r+ Abre el archivo en modo lectura/escritura; el archivo debe existir.
w+ Abre un archivo de lectura/escritura. Si el archivo existe, su longitud se borra a cero, es decir, el contenido del archivo desaparece. Si el archivo no existe, se crea.
a+ Similar a 'a', pero este archivo se puede leer y escribir.
b Modo binario. Si el archivo es binario, se puede añadir 'b'.
+ El signo '+' indica que el archivo se puede tanto leer como escribir.

Modo simple

El modo simple utiliza I/O estándar o un archivo de entrada actual y un archivo de salida actual.

El siguiente es el código del archivo file.lua; el archivo operado es test.lua (si no existe, debes crearlo). El código es:

Ejemplo

-- Abrir el archivo en modo solo lectura
file = io.open("test.lua", "r")

-- Establecer el archivo de entrada predeterminado como test.lua
io.input(file)

-- Mostrar la primera línea del archivo
print(io.read())

-- Cerrar el archivo abierto
io.close(file)

-- Abrir un archivo de solo escritura en modo añadir
file = io.open("test.lua", "a")

-- Establecer el archivo de salida predeterminado como test.lua
io.output(file)

-- Añadir un comentario Lua en la última línea del archivo
io.write("-- Comentario al final del archivo test.lua")

-- Cerrar el archivo abierto
io.close(file)

Al ejecutar el código anterior, notarás que se muestra la primera línea del archivo test.lua y se añade un comentario Lua en la última línea del archivo. Por ejemplo, la salida en mi caso es:

-- test.lua 文件

En el ejemplo anterior usamos el método io."x". En io.read() no pasamos parámetros; el parámetro puede ser uno de los siguientes:

ModoDescripción
"*n"Lee un número y lo devuelve. Ej.: file.read("*n")
"*a"Lee todo el archivo desde la posición actual. Ej.: file.read("*a")
"*l" (predeterminado)Lee la siguiente línea; en el final del archivo (EOF) devuelve nil. Ej.: file.read("*l")
numberDevuelve una cadena con un número especificado de caracteres, o nil en EOF. Ej.: file.read(5)

Otros métodos de io son:

  • io.tmpfile():Devuelve un manejador de archivo temporal, que se abre en modo actualización y se elimina automáticamente al finalizar el programa.

  • io.type(file):Comprueba si obj es un manejador de archivo válido.

  • io.flush():Escribe todos los datos del búfer en el archivo.

  • io.lines(optional file name):Devuelve una función iteradora que, en cada llamada, obtiene una línea del archivo. Cuando se llega al final del archivo, devuelve nil, pero no cierra el archivo.


Modo completo

Normalmente necesitamos procesar varios archivos al mismo tiempo. Debemos usar file:function_name en lugar del método io.function_name. El siguiente ejemplo demuestra cómo manejar el mismo archivo a la vez:

Ejemplo

-- Abrir el archivo en modo solo lectura
file = io.open("test.lua", "r")

-- Mostrar la primera línea del archivo
print(file:read())

-- Cerrar el archivo abierto
file:close()

-- Abrir un archivo de solo escritura en modo añadir
file = io.open("test.lua", "a")

-- Añadir un comentario Lua en la última línea del archivo
file:write("--test")

-- Cerrar el archivo abierto
file:close()

Al ejecutar el código anterior, notarás que se muestra la primera línea del archivo test.lua y se añade un comentario Lua en la última línea del archivo. Por ejemplo, la salida en mi caso es:

-- test.lua 文件

Los parámetros de read son iguales que en el modo simple.

Otros métodos:

  • file:seek(optional whence, optional offset):Establece y obtiene la posición actual del archivo. Si tiene éxito, devuelve la posición final del archivo (en bytes); si falla, devuelve nil más un mensaje de error. El parámetro whence puede ser:

    • "set": desde el inicio del archivo
    • "cur": desde la posición actual [predeterminado]
    • "end": desde el final del archivo
    • offset: por defecto es 0
    Sin parámetros, file:seek() devuelve la posición actual; file:seek("set") se posiciona al inicio del archivo; file:seek("end") se posiciona al final del archivo y devuelve el tamaño del archivo.
  • file:flush():Escribe todos los datos del búfer en el archivo.

  • io.lines(optional file name):Abre el archivo especificado filename en modo lectura y devuelve una función iteradora. Cada llamada obtiene una línea del archivo; al llegar al final del archivo, devuelve nil y cierra automáticamente el archivo.
    Si no se pasan parámetros, io.lines() <=> io.input():lines(); lee el contenido del dispositivo de entrada predeterminado, pero no cierra el archivo al final. Por ejemplo:

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

El siguiente ejemplo usa el método seek para posicionarse en la posición 25 contando desde el final y usa el parámetro *a del método read, es decir, lee todo el archivo desde la posición actual (la posición 25 desde el final).

Ejemplo

-- Abrir el archivo en modo solo lectura
file = io.open("test.lua", "r")

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

-- Cerrar el archivo abierto
file:close()

El resultado que obtengo en mi caso es:

st.lua 文件末尾--test
Otras extensiones