Fundamentos de programación Ficheros Ficheros Un fichero o archivo es un objeto abstracto sobre el que se puede leer y escribir información. Los datos almacenados en un fichero no son volátiles. ¾ Ficheros de texto • Almacenan los datos usando caracteres ASCII. • En general, pueden ser visualizados con un editor de texto. ¾ Ficheros binarios • Almacenan los datos como una secuencia de bytes. • No pueden ser visualizados con un editor de texto. Ficheros Para acceder a un fichero utilizaremos el tipo FILE que está predefinido en el header <stdio.h>. El fichero con el que vamos a trabajar quedará identificado con un puntero a FILE. #include <stdio.h> FILE * fp; C predefine tres objetos estándar de tipo FILE * : ¾ stdin : Entrada estándar (teclado) ¾ stdout : Salida estándar (pantalla) ¾ stderr : Salida de errores (pantalla) Ficheros Operaciones con ficheros FILE * fopen (const char * name, const char * modo) Abre el fichero de nombre name; retorna un puntero que identifica el fichero en cuestión, o NULL si la apertura falla. Los modos válidos son: “r” Abre fichero para sólo lectura “w” Crea fichero para sólo escritura (borra contenido anterior) “a” Abre o crea fichero para escritura al final del mismo (añadir) “r+” Abre fichero para modificación (lectura y escritura) “w+” Crea fichero para modificación (borra contenido anterior) “a+” Abre o crea fichero para modificación (escritura sólo al final) “xb” “rb” “w+b” b indica fichero binario, x es cualquier modo anterior Abre fichero binario en modo sólo lectura Crea fichero binario en modo modificación (borra contenido) Ficheros Operaciones con ficheros int fclose (FILE * fp) Obliga a volcar el contenido de la memoria intermedia y cierra fp; retorna 0 si el cierre es correcto, o EOF si se produce algún error. int fflush (FILE * fp) Obliga a escribir en fp cualquier dato en memoria intermedia que aún no ha sido volcado; retorna 0 si la operación es correcta, o EOF en otro caso. int feof (FILE * fp) Retorna un valor no nulo si se ha alcanzado el fin de fichero en fp. long ftell (FILE * fp) Retorna la posición en curso dentro de fp, o -1 si hay un error int fseek (FILE * fp, long offset, int origen) Asigna una posición dentro de fp; cualquier lectura o escritura de datos posterior comenzará a partir de la posición asignada. Retorna un valor no nulo si se encuentra un error. Ficheros Operaciones con ficheros int fprintf (FILE * fp, const char * formato, ...) Escribe en fp los datos correspondientes con el formato indicado; retorna el número de caracteres escrito, o un número negativo si hay error. int printf (const char * formato, ...) printf (formato, ...) es equivalente a fprintf (stdout, formato, ...). int sprintf (char * s, const char * formato, ...) sprintf es lo mismo que printf, excepto que se escribe sobre la cadena s y que se termina con un ‘\0’; retorna el número de caracteres escritos sin incluir el nulo ‘\0’, o un número negativo en caso de error. int fscanf (FILE * fp, const char * formato, ...) Obtiene de fp los datos de acuerdo con el formato especificado y asigna, previa conversión, los valores a los argumentos que deben ser direcciones; retorna EOF si es fin de fichero o bien se detecta error en la conversión de algún dato, en otro caso retorna el número de datos asignados. Ficheros Operaciones con ficheros int scanf (const char * formato, ...) scanf(formato, ...) es equivalente a fscanf(stdin, formato, ...). int sscanf (const char * s, const char * formato, ...) sscanf(s, formato, ...) es equivalente a scanf(formato, ...) excepto que los caracteres de entrada se toman del string s. int fgetc (FILE * fp) Retorna el siguiente carácter de fp como unsigned char (convertido a int), o EOF si es fin de fichero o bien ocurre un error. char * fgets (char * s, int n, FILE * fp) Obtiene como máximo los siguientes n - 1 caracteres de fp, que son almacenados en el array s. fgets termina cuando encuentra un salto de línea ‘\n’ que es incluido en el array, y el array se finaliza con un ‘\0’. fgets devuelve NULL si es fin de fichero o hay un error, y en otro caso s. Ficheros Operaciones con ficheros int fputc (int c, FILE * fp) Escribe el entero c (convertido a unsigned char) en fp; retorna el carácter escrito, o EOF si hay error. int fputs(const char *s, FILE * fp) Escribe el string s (no necesariamente debe contener ‘\n’) en fp; retorna EOF si se encuentra un error, o un número negativo en otro caso. int getc (FILE * fp) getc es equivalente a fgetc, excepto que es una macro y por tanto puede evaluar fp más de una vez. int getchar (void) getchar() es lo mismo que getc(stdin). char * gets (char * s) Carga en el array s la siguiente línea de la entrada estándar, reemplazando el fin de línea ‘\n’ por ‘\0’; retorna s, o NULL si es fin de fichero o hay error. Ficheros Operaciones con ficheros int putc (int c, FILE * fp) putc es equivalente a fputc excepto que es una macro, y en consecuencia puede evaluar fp más de una vez. int putchar (int c) putchar(c) es lo mismo que putc(c,stdout). int puts (const char * s) Escribe el string s seguido de un salto de línea ‘\n’ en la salida estándar; retorna EOF si ocurre un error, o un número no negativo en otro caso. int ungetc (int c, FILE * fp) Reubica (hace retroceder) el carácter c (convertido a unsigned char) en fp, de forma que pueda retornarse en la siguiente lectura. Sólo se garantiza un carácter de retroceso por fichero, y EOF no puede ser reubicado. ungetc retorna el carácter reubicado, o EOF si se detecta un error. Ficheros Operaciones con ficheros size_t fread (void * ptr, size_t size, size_t nobj, FILE * fp) Almecena en el array ptr, como máximo, nobj objetos de tamaño size leídos de fp; retorna el número de objetos leídos (que puede ser menor que el número nobj especificado). Para determinar el status de fread se deben utilizar las funciones feof(fp) y ferror(fp). size_t fwrite (const void * ptr, size_t size, size_t nobj, FILE * fp) Escribe en fp nobj objetos de tamaño size que son obtenidos del array ptr; retorna el número de objetos escritos (que puede ser menor que nobj si se detecta un error). int ferror (FILE * fp) Retorna un valor no nulo si el indicador de error de fp está activo. Ficheros #include <stdio.h> int main () /* copia de ficheros */ { int c; FILE *fent, *fsal; if((fent = fopen(“entrada”,“r”)) == NULL) { puts(“Error fichero entrada”); return -1; } if((fsal = fopen(“salida”,“w”)) == NULL) { puts(“Error fichero salida”); return -1; } while((c = fgetc(fent)) != EOF) fputc(c,fsal); fclose(fent); fclose(fsal); return 0; }