Programación científica Archivos Dra. Elisa Schaeffer [email protected] PISIS / FIME / UANL Archivos– p. 1 Tipo de dato FILE En ANSI-C, un FILE es un “mango” a un archivo en el sistema de archivos. Típicamente manejamos un puntero al mango, o sea, un FILE ∗. Archivos– p. 2 Terminal y teclado stdin stdout stderr teclado para leer terminal para escribir errores para escribir Entonces, fprintf(stdout, ...); = fscanf(stdin, ...); = printf(...); scanf(...); Archivos– p. 3 Abrir: leer/escribir FILE∗ f = fopen(...); Dos parámetros: el nombre del archivo el modo de acceso La salida es NULL si la operación no fue éxitosa. Archivos– p. 4 Modos de acceso r w a r+ w+ a+ ...b leer escribir reemplazando escribir añadiendo leer o escribir crear para leer y escribir crear o abrir para añadir lo definido en modo binario Las operaciones para escribir crean el archivo dicho si todavía no existe. Cuidado con no reemplazar archivos existentes de importancia. Archivos– p. 5 Leer símbolo por símbolo int c = fgetc(...) toma un mango FILE ∗, lee un símbolo (en un int ) y lo envia a su salida. El caractér EOF indica el fin de archivo. fgetc(stdin) = getc() ungetc(...) dado un símbolo (char ) y un mango (FILE ∗), devuelve el símbolo “virtualmente” al archivo para que el siguiente símbolo leído sea el símbolo “repuesto”. Archivos– p. 6 Leer línea por línea Con fgets(...) podemos leer una línea a la vez. Toma tres parámetros: un char ∗ al espacio donde guardar la línea leída, el largo máximo de la línea (int ) y el mango FILE ∗ al archivo. La salida es NULL si la operación falló y un char ∗ válido en otro caso. Archivos– p. 7 Escribir línea por línea Los símbolos a los cuales apunta un char ∗ pueden ser escritos en un archivo por pasar el puntero a ellos juntos con el mango al archivo a fputs(...). La salida es cero si todo fue bien, no cero si hubo errores. Archivos– p. 8 ¿Todavía queda algo? feof(...) toma un mango y devuelve “1” si el archivo ya está procesado a su final y “0” en otro caso. Archivos– p. 9 Todo a la vez fread(...) lee los contenidos del archivo entero dado cuatro parámetros: 1. un char ∗ a dónde guardar lo leído 2. el tamaño de la unidad leída en múltiples de sizeof(char) (o sea, “1”) 3. el número de unidades para leer 4. el mango al archivo FILE ∗ La salida es no cero si algo fue leído éxitosamente. También existe fwrite(...) con los mismos tipos de parámetros. Archivos– p. 10 Asegurar que todo entre No todo el contenido escrito en un archivo aparece en ello inmediatamente en el disco. Para asegurar que el contenido sea transferido al disco, hay que llamar fflush(...) con el mango del archivo. Archivos– p. 11 Volver a procesar Con rewind podemos regresar el mango al inicio del archivo. El único parámetro es el mango mismo. Archivos– p. 12 Cerrar Cuando acceso a un archivo ya no es necesario, el mango se elimina por fclose(...) donde el único parámetro es el mango FILE ∗. Es importante checar que no sea NULL el mango; al cerrar un NULL , típicamente habrá errores durante ejecución. Archivos– p. 13 stdio.h Todo esto y más está incluido en la librería stdio.h . En C++ hay aún más funciones para manejar archivos (ver fstream) y para Java existe una librería ámplia también. Archivos– p. 14