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:
| Modo | Descripción |
|---|---|
| r | Abre el archivo en modo solo lectura; el archivo debe existir. |
| w | Abre 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. |
| a | Abre 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
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:
| Modo | Descripció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") |
| number | Devuelve 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
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
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
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 文件末尾--testOtras extensiones