Anuncios Google

8. Lectura y escritura de ficheros

Tutoriales Avanzados Homebrewes

En esta lección vamos a aprender cómo leer y escribir en archivos. Puede ser muy útil a la hora de hacer juegos. Puedes usarlo para ejecutar código de otros archivos, al igual que para guardar información en ficheros, tal como mejores marcas, partidas guardadas, estadísticas de jugadores, etc. ¡Empecemos!

Uso de la lectura y escritura de ficheros

Lo primero es mirar un sencillo comando llamado dofile. Este comando leerá código de otro fichero e inmediatamente lo ejecutará.

dofile("./test.lua")

El comando es tan simple como eso. Fíjate que "./" significa que el archivo está en el mismo directorio. Si estuviera en un subdirectorio usaríamos esto:
dofile("./archivos/test.lua")

Así, si nuestro archivo test.lua contiene este código:

jugadorx = 10
jugadory = 20
enemigox = 40
enemigoy = 50

entonces tan pronto como llamamos al archivo con el comando dofile, esas variables serán declaradas. No es necesario usar archivos con extensión "lua", también valdrían archivos "txt" u otros.

Leer una sola línea de un archivo

Imaginemos que tenemos un archivo con varias líneas de texto y tú quieres leer sólo una y mostrarla por pantalla. Podemos usar el comando io.open() para abrir el archivo y leer de él. Este comando se escribe así: io.open(nombre_archivo, modo). El modo que usaremos para leer será r. Como referencia muestro la lista de todos los modos disponibles:

  • r -> modo lectura.
  • w -> modo escritura (sobreescribe el texto existente).
  • a -> modo añadir (añade al texto existente).
  • b -> modo binario.
  • r+ -> modo actualizar (preserva el texto existente).
  • w+ -> modo actualizar (elimina el texto existente).
  • a+ -> modo añadir actualizado (preserva el texto existente, añade al final del texto).

Lo primero que haremos será abrir el archivo y almacenarlo en una variable.
archivo = io.open("testLectura.txt","r")

Nuestro archivo testLectura.txt ha sido abierto y está listo para el modo lectura. Ahora usaremos el comando read() para leer una sola línea del archivo y la guardaremos en otra variable.

nuestraLinea = archivo:read()

Esto leerá la primera línea de nuestro archivo de texto. La próxima vez que usemos el comando read() leerá la segunda línea y así sucesivamente. Fíjate que usamos el nombre de nuestra variable con la que hemos abierto el fichero. También hay argumentos que puedes usar con archivo.read(). IMPORTANTE: fíjate que antes hemos visto archivo:read() y ahora estamos hablando de archivo.read(). Puedes poner cualquiera de los siguientes argumentos dentro de los paréntesis con comillas.

  • *n -> lee un número y lo devuelve. Ej: archivo.read("*n").
  • *a -> lee el archivo entero desde la posición actual. Ej: archivo.read("*a").
  • *| -> (opción por defecto) lee la siguiente línea, devuelve "nil" si es final de fichero (EOF). Ej: archivo.read("*|").
  • número - devuelve una cadena de tantos caracteres como se indique o devuelve nil si es final de fichero. Ej: archivo.read(5).

Después de leer nuestra línea, tenemos que cerrar el fichero abierto así:

archivo:close()

Ahora para mostrar nuestra línea por pantalla, simplemente usaremos:

screen:print(10,10,nuestraLinea,blanco)

Leer todas las líneas

Para leer todas las líneas de un archivo podemos usar la misma técnica con un for. Fíjate:

y = 10
archivo = io.open("testLectura.txt","r")
 
for linea in archivo:lines() do
y = y + 10
screen:print(100,y,linea,blanco)
end
 
archivo:close()

Este código inicializa "y" para usarla para imprimir, así se imprimirá cada línea en una "y" (coordenada) diferente en pantalla. Abrimos nuestro archivo igual que antes. Luego viene el bucle for. Esa línea dice que para cada línea que haya en el archivo haga lo siguiente. A nuestra "y" se le suma 10 en cada pasada del bucle y es usada en el comando imprimir para mostrar cada línea debajo de la anterior.

Escribir en archivos (sobreescribir)

Escribir en archivos se hace de la misma manera. Nuestro primer método será sobreescribiendo cualquier cosa que estuviera en el archivo anteriormente:

archivo = io.open("testLectura.txt","w")
archivo:write("hola")
archivo:close()

Fíjate que usamos el modo w en vez del r ya que estamos escribiendo, no leyendo. Usamos archivo:write() con el texto que queremos escribir en el archivo dentro del paréntesis entrecomillado. También puedes usar una variable en vez del texto, en este caso no llevaría comillas. Ej:

archivo = io.open("testLectura.txt","w")
miTexto = "hola de nuevo"
archivo:write(miTexto)
archivo:close()

Escribir en archivos (añadir)

Puedes usar el modo añadir y así el texto será añadido al final del texto existente, en vez de borrarlo todo. Se hace exactamente igual que el modo w excepto que hay que poner a. Mira:

archivo = io.open("testLectura.txt","a")
miTexto = "\nhola una vez más"
archivo:write(miTexto)
archivo:close()

¿Notas algo distinto? En la variable miTexto hemos añadido \n dentro de la cadena de texto. Este comando es un salto de línea y hace que el texto vaya a la siguiente línea cuando lo escribimos en nuestro archivo. Puede aparecer en tu archivo un pequeño cuadrado, pero técnicamente eso es una nueva línea. Este comando se usa también en C/C++.

Intenta usar lo que acabas de aprender aquí haciendo un pequeño programa por tu cuenta.

4.333335
Tu voto: Ninguno Votos totales: 4.3 (39 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

No carga con ./

estoy cargando una imagen así:

fondo = Image.load("./fondo.png")

tengo el fondo en la misma carpeta que el luaplayer.exe y que mostrarfondo.lua
pero no me funciona
Qué he hecho mal?

Imagen de Andres_Ne

LuaDev

Definitivamente luadev es lo mejor que hay.

Imagen de gdljjrod

que error te da??

si está en el mismo directorio que el script.lua, prueba con:

fondo = Image.load("fondo.png")

Imagen de Davidm16

Hay un problema.

Cuando quiero añadir dofile("newfile.lua") me sale un error ')'.

Pones

Pones eso:
archivo:write(dofile("newfile.lua"))  

o eso:

archivo:write('dofile("newfile.lua")')  

Imagen de Davidm16

Gracias, me va.

¿Y ahora cómo pongo para que escriba en una línea concreta?

Dudas !

Y si yo quiero que ver una fila del mismo texto, como lo haria ?

Ej:

1- juan compro un coche rojo.

2- Pero pedro lo queria azul

3- Donde a juana le gusto el coche rojo.

 

Osea suponiendo que yo solo quiero leer solamente una linea del bloc de nota y no verla todas a la vez.

 

Saludo !!!

...

Este tutorial acaba de alegrarme un poquito más la vida. POR FIN funciona el código que he estado toda la tarde programando...

GRACIAS :D


 

 

Imagen de NauTiluS1

como hago para abrir una

como hago para abrir una imagen en el menu de juego miren el codigo

 

if pad:cross() and mActual == 3 then

donde quiero que habra la imagen lo cual nose como xD

end


Follow me twitter nautilus1_jmccu!!
Sony, ya a nadie le interesa tus UMD si alguien compra una psp es por nosotros los coders. Madura y has un FW que haga la diferencia y anime a las personas en comprar un PSP

Imagen de NauTiluS1

hola no se ven las letras

blanco = Color.new(255,255,255)

archivo = io.open("testLectura.txt","r")
nuestraLinea = archivo:read()
archivo:close()

screen:print(10,10,nuestraLinea,blanco)
while true do
   
end

 

abro el script y se queda en negro nose que hice mal


Follow me twitter nautilus1_jmccu!!
Sony, ya a nadie le interesa tus UMD si alguien compra una psp es por nosotros los coders. Madura y has un FW que haga la diferencia y anime a las personas en comprar un PSP

as easy as this:   blanco =

as easy as this:

 


blanco = Color.new(255,255,255)

archivo = io.open("testLectura.txt","r")
nuestraLinea = archivo:read()
archivo:close()

while true do

   screen:print(10,10,nuestraLinea,blanco)

 screen.waitVblankStart()

screen:flip()
end

Imagen de Maxwuel

ayuda

hola a todosss

miren e echo esto :

blanco = Color.new(255,255,255)

archivo = io.open("prueba.txt","r")
nuestraLinea = archivo:read()
archivo:close()

screen:print(10,10,nuestraLinea,blanco)

 

abro el script y se me cierra

 

nose donde esta el error

ayudaa

 

mm

si solo has puesto eso, es mi opinion, que tambien estoy aprendiendo,

te faltaría el bucle

while true do

...

...

screen...

..

end

Imagen de Monty - Calabato64

dofile

Una pregunta, ¿se puede hacer un dofile a un eBoot.pbp de otra aplicación que no esté programada en LUA?

Imagen de Robione22

como leo

el nombre de una carpeta ubicada en la memory stick y como le cambio el nombre bueno gracias de antemanoWink

Imagen de yoan03

este tutorial

es para cambiar de nivel, de menu, etc???

Imagen de CkFra

Realmente

con la escritura de ficheros puedes hacer infinidad de cosas, todo lo que se ocurra y con ellos te sirva. (Siempre de un modo racional, no te pases creando .txt, creo que me exlico :P)

Puedes guardar toda la info que se te ocurra

Saludos 

Imagen de Warezman

Ayuda por favor

Miren si quiero que cuando ( un ejemplo ) junto 100 puntos en el nivel 1 del juego quiero que lea el archivo que es el nivel 2 que comandos uso

Saludos

Imagen de CkFra

Duda...

Esto no lo pillo (Vamos, supongo que es un fallo a la hora de escribirlo)

"IMPORTANTE: fíjate que antes hemos visto archivo:read() y ahora estamos hablando de archivo.read(). Puedes poner cualquiera de los siguientes argumentos dentro de los paréntesis con comillas."

Dice que antes hemos visto archivo:read() y ahora hablamos de archivo:read(). A qué se refiere en el caso en el que está equivocado?

Muy bien explicado.

Muy bien explicado.
si señor un 10 , plas , plas , plas

un saludo
Spirax

Imagen de Unicorn

xD

ya veo que ya puedes publicar tus tutos en el lugar adecuado, jeje. Ahora que habia yo aprendido a pasartelos aqui y le habia quitado a Abis esa tarea que tanto le gusta....

Un saludo compañero. 


Para recibir ayuda más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda revisar el Manual del perfecto forero y las Normas de la Comunidad.

Imagen de ELeNDeR

Sí, ya ves que he

Sí, ya ves que he promocionado de Colaborador a Editor :P Además Abismo me enseño a publicarlo correctamente y posteriormente Niteman me aclaró algunas dudillas, así que con esos 2 maestros es imposible no aprender :P

Pues bueno, un tuto más, bastante interesante, creo yo. Todos a programar en LUA!!! 

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.