Hoy aprenderemos a manejar los archivos, es decir, aprenderemos a copiar/escribir/borrar un archivo mezclando las librerías oslib con las librerías pspsdk. Mezclar estas librerías no supone que entre ellas haya errores, todo lo contrario te ayudan ha hacer funciones que la otra librería no puede.
Autor: Dioni0396.
Muchos de vosotros, seguramente os interese hacer un aplicación que coja un archivo y lo copie, o que guarde la puntuación mas alta, pues no temáis hoy aprenderemos eso y mucho más. Empecemos:
Abriendo/Escribiendo en un archivo:
//Cargaríamos nuestras librerías como siempre. //Y en algún momento de nuestro código queremos que haga esa acción de escribir. //Recomiendo no poner estas funciones en un while, mejor en una sentencia. if(osl_keys->pressed.circle){ FILE *Datos; //Primero debemos crear un puntero con el tipo de Dato: FILE, esto es esencial. //Bien, Datos = fopen("Nombre_archivo.extension","Modo"); //Eso de arriba es un modelo de ejemplo, no es la función real. Os explico que hay que poner /* En el primer argumento el archivo y su extensión * En el segundo el modo, los modos que existen son: "r" - Modo lectura. "w" - Modo escritura. "a" - Modo adición. Este modo lo que hace es poner en una linea mas abajo del texto que haya lo que tu quieras "r+" - Lectura/Escritura. Los datos pre-existentes se conservan. "w+" - Lectura/Escritura. Los datos pre-existentes se eliminan. "a+" - Lectura/Escritura. Los datos pre-existentes se conservan. "rb" - Lectura, datos del tipo binario. "wb" - Escritura, datos del tipo binario. "ab" - Adición, datos del tipo binario. * Recordad que siempre, el modo tiene que ir entrecomillas (""). */ Datos = fopen("Puntos.txt","w"); //Bien, ahora tenemos que escribir, el modelo a usar seria así: fprintf(Archivo,Texto) //En Texto, no puede haber otra cosa nada mas que datos con puntero char, si no son char el compilador dará error fprintf(Datos,"60"); //Por ultimo cerramos fclose(Datos); }
Bien, ya tenemos nuestro archivo con nuestro texto, o en este caso número. Así de sencillo es escribir, y esto sirve para casi todos los archivos, excepto binario (Si sabes binario no hay problema).
Copiando un archivo:
//El otro día, encontré una función interesante de copiado de archivos, tras experimentarlo vi que era fácil de aprender //y por eso os lo voy a exponer //Primero cargamos un buffer de 128 Kb char write_buffer[128*1024]; //Ahora prestad atención a la función int write_file(const char *Archivo, const char *Direccion_a_copiar) //Creamos una función { int fdin; //Creamos unas variables int fdout; fdin = sceIoOpen(Archivo, PSP_O_RDONLY, 0777); //Abrimos el archivo con sceIoOpen, esta función abre cualquier archivo, recomiendo usarlo tal y como esta ahí, no cambiéis los parámetros. //Necesitareis cargar antes la librería <pspkernel.h> y <pspdebug.h> if(fdin >= 0) { int bytesRead = 1; //Si lo ha leído creamos una variable que nos de valor 1, como un Si. fdout = sceIoOpen(Direccion_a_copiar, PSP_O_WRONLY | PSP_O_CREAT, 0777); //Con la otra variable crea el otro archivo. if(fdout < 0) { //En caso de fallo... pspDebugScreenPrintf(" No se pudo abrir %s\n", Direccion_a_copiar); return -2; } bytesRead = sceIoRead(fdin, write_buffer, sizeof(write_buffer)); //Hacemos que la variable lea el archivo con el buffer que previamente hemos creado while((bytesRead > 0) && (fdout >= 0)) //Si todo ha cargado bien... { sceIoWrite(fdout, write_buffer, bytesRead); //Escribimos bytesRead = sceIoRead(fdin, write_buffer, sizeof(write_buffer)); //Leemos que todo esta bien //Si hemos terminado de copiar nos salimos del bucle } if(fdout >= 0) { sceIoClose(fdout); //Cerramos el archivo } if(fdin >= 0) { sceIoClose(fdin); //Cerramos el archivo } } else { pspDebugScreenPrintf(" No se pudo abrir %s\n", Archivo); //Si lo ha leído bien no entrara a esta sentencia return -1; } return 0; }
Con esto, se nos copiaría el archivo a nuestra ruta que deseemos.
Borrando un archivo/carpeta:
//Esto es sencillo, para borrar un archivo usamos esto: sceIoRemove(const char * Ruta_Archivo) //Con poner la ruta, lo borrara todo. //Para borrar una carpeta usamos: sceIoRmdir(const char * Ruta_Carpeta) //Borrara la carpeta y su contenido
Renombrando un archivo:
//Sencillisimo: sceIoRename(Nombre_Antiguo,Nombre_Nuevo)
Esto es todo por hoy, si tienen dudas coméntenlas.
Comentarios
Ejem...
Disculpa, pero esto:
no "llama a un puntero" (las que se llaman son las funciones), lo correcto sería decir "crea un puntero" ya que las funciones son las que se llaman, y FILE no es una calisificación, es un Tipo de dato.
Edito: Una cosa más, si fopen no puede abrir el archivo dará error al tratar de escribir, lo correcto sería comprobar que luego del fopen el puntero Datos no sea igual que NULL, si lo es, quiere decir que hubo un error al abrir el archivo y se debería manejar eso.
Saludos.
PSP FAT [5.00 M33-6] [6.60 ME] [Hard Moded] / Nintendo Wii [4.1U] [cIOS Hermes] [D2X cIOS] / iPhone 3G [4.2.1] [BB 05.13.04] [redsn0w] / iPod Touch 4 [6.1] [evasi0n]
07/05/10: Tuve el placer de llamarle con todo derecho "N00B" a molotovi xDDD
Recuerda: Sé el intérprete -_-
Claro, eso
Sobre lo el Edito:
Claro, eso seria si exprimes, esto es lo basico, es decir yo enseño la funcion, como se maneja y tal pero no enseño a como decirse que si falla haga X cosa, que aparte, en la funcion write file hay un ejemplo practico de que hace cuando no puede abrirlo.
Sobre lo primero:
Si, tienes razon, enseguida lo edito.
Rayos
Se me resbaló el dedo y escribí mal clasificación jajaj
Lo que te preocupa jajajaja,
Lo que te preocupa jajajaja, por sierto dioni en este tipo de cosas siempre hay que hacer algun delay para evitar errores como cuelgues o pantallas negras.