Contenidos • • • • Programación I Ficheros de texto 1 Ficheros Lectura de ficheros de texto Escritura de ficheros de texto Aspectos avanzados • Posicionamiento en un fichero • Lectura de tokens de cadenas de caracteres Iván Cantador Escuela Politécnica Superior Universidad Autónoma de Madrid Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid Contenidos • • • • 2 Ficheros Lectura de ficheros de texto Escritura de ficheros de texto Aspectos avanzados • Posicionamiento en un fichero • Lectura de tokens de cadenas de caracteres Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid Ficheros (I) 3 • Un fichero o archivo es un conjunto de bits que es tratado por el sistema operativo como única unidad lógica • Un fichero está identificado por su nombre (en general, con extensión) y por la ruta de la carpeta/directorio en el que se encuentra C:/Programacion1/Ejemplos/archivo.txt • El tamaño de un fichero se expresa generalmente en Bytes • Una carpeta o directorio es en realidad un fichero, cuya finalidad es la de “almacenar” otras carpetas y ficheros Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid Ficheros (II) 4 Ficheros (III) • Desde un programa informático la lectura y escritura de un fichero se realizan en 3 pasos: • Existen 2 tipos de ficheros: • Ficheros de texto (plano): contienen sólo líneas de texto sin formato, sin otro tipo de datos (p.e. imágenes, gráficas, etc.) ‐ Con posibles codificaciones: ASCII, UTF‐8, EBCDIC … ‐ Normalmente asociados a la extensión .txt • Ficheros binarios: contienen datos almacenados en un formato arbitrario (generalmente asociado a una extensión concreta: .doc, .pdf, .jpg, .mp3) representando todo tipo de medios: texto, imagen, sonido, video 1. Apertura 2. Lectura/escritura 3. Cierre • En programación, un fichero se suele representar mediante una estructura, denominada “manejador” (handler en inglés) • En C, se usa el tipo de datos FILE, definido en <stdio.h> • Entre otras cosas, contiene un puntero a la próxima posición de lectura/escritura del fichero Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid Ficheros (IV) 5 Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid 6 Ficheros (V) 7 • Apertura de un fichero • Apertura FILE *fopen(char *rutaFichero, char *modoApertura) • Lectura/cierre int fscanf(FILE *fichero, char *formato, ... <variables> ...) char *fgets(char *cadena, int numeroBytes, FILE *fichero) int fprintf(FILE *fichero, char *formato, ... <variables> ...) • Cierre void fclose(FILE *fichero) Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid FILE *fopen(char *rutaFichero, char *modoApertura) • Modos de apertura principales ‐ "r": apertura del fichero en modo lectura ‐ "w": apertura del fichero en modo escritura ‐ sobreescritura; si el fichero no existe, lo crea; si el fichero sí existe, escribe al principio del mismo y eliminando el texto existente ‐ "a": apertura del fichero en modo escritura ‐ actualización; si el fichero no existe, lo crea; si el fichero sí existe, escribe al final del mismo sin eliminar el texto existente Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid Contenidos 8 Lectura de ficheros de texto (I) 9 • Lectura de un fichero de texto: fscanf int fscanf(FILE *fichero, char *formato, ... <variables> ...) • • • • • Ejemplo: lectura de un fichero con una línea que contiene un número entero, un número real, y una cadena de caracteres separados por espacios en blanco Ficheros Lectura de ficheros de texto Escritura de ficheros de texto Aspectos avanzados include <stdio.h> void main() { FILE *fichero = NULL; int retorno, n; double r; char s[256]; • Posicionamiento en un fichero • Lectura de tokens de cadenas de caracteres fichero = fopen("C:/Programacion1/prueba.txt", "r"); if ( fichero ) { retorno = fscanf(fichero, "%d %f %s\n", &n, &r, s); if ( retorno == 3 ) printf("Leidos: %d %f %s\n", n, r, s); fclose(fichero); } } Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid Lectura de ficheros de texto (II) Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid 10 Contenidos 11 • Lectura de un fichero de texto: fscanf int fscanf(FILE *fichero, char *formato, ... <variables> ...) • Ejemplo: lectura de varias líneas de un fichero (con el formato de línea del ejemplo anterior) include <stdio.h> void main() { FILE *fichero = NULL; int retorno, n; double r; char s[256]; fichero = fopen("C:/Programacion1/prueba.txt", "r"); if ( fichero ) { // Mientras no sea fin de fichero, leemos linea while ( !feof(fichero) ) { retorno = fscanf(fichero, "%d %f %s\n", &n, &r, s); if ( retorno == 3 ) printf("Leidos: %d %f %s\n", n, r, s); } fclose(fichero); } • • • • Ficheros Lectura de ficheros de texto Escritura de ficheros de texto Aspectos avanzados • Posicionamiento en un fichero • Lectura de tokens de cadenas de caracteres } Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid Escritura de ficheros de texto (I) 12 • Lectura de un fichero de texto: fprintf Escritura de ficheros de texto (II) • Lectura de un fichero de texto: fprintf int fprintf(FILE *fichero, char *formato, ... <variables> ...) int fprintf(FILE *fichero, char *formato, ... <variables> ...) • Ejemplo: creación de un fichero con una línea que contiene un número entero, un número real, y una cadena de caracteres separados por espacios en blanco • Ejemplo: actualización de un fichero añadiendo una línea que contiene un número entero, un número real, y una cadena de caracteres separados por espacios en blanco include <stdio.h> include <stdio.h> void main() { FILE *fichero = NULL; int n = 10; double r = 8.5; char s[256] = "abcde"; void main() { FILE *fichero = NULL; int n = 10; double r = 8.5; char s[256] = "abcde"; // Abrimos el fichero en modo escritura - sobreescritura fichero = fopen("C:/Programacion1/prueba.txt", "w"); // Abrimos el fichero en modo escritura - actualizacion fichero = fopen("C:/Programacion1/prueba.txt", "a"); if ( fichero ) { fprintf(fichero, "%d %f %s\n", n, r, s); fclose(fichero); } if ( fichero ) { fprintf(fichero, "%d %f %s\n", n, r, s); fclose(fichero); } } } Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid Contenidos Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid 14 Posicionamiento en un fichero • Posicionamiento en un fichero: fseek fseek(<fichero>, <offset>, <origen>) • • • • 13 Ficheros Lectura de ficheros de texto Escritura de ficheros de texto Aspectos avanzados • Posicionamiento en un fichero • Lectura de tokens de cadenas de caracteres Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid fseek(f, 0L, SEEK_SET); // Al comienzo del fichero fseek(f, 0L, SEEK_CUR); // En la posicion actual fseek(f, 0L, SEEK_END); // Al final del fichero fseek(f, 256L, SEEK_SET); // En el Byte 256 • Funciones relacionadas • ftell: devuelve la posición actual de lectura/escritura • rewind: equivale a fseek(f, 0L, SEEK_SET) Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid 15 Contenidos 16 Lectura de tokens de cadenas de caracteres (I) • La función strtok (de <string.h> • “Tokeniza” (trocea) una cadena de caracteres atendiendo a un conjunto de caracteres delimitadores • • • • Ficheros Lectura de ficheros de texto Escritura de ficheros de texto Aspectos avanzados #include <stdio.h> #include <string.h> void main() { char *cadena = "primero segundo, tercero\tcuarto"; char *delimitadores = " ,\t"; char *token = NULL; printf("Tokens de %s:\n", cadena); • Posicionamiento en un fichero • Lectura de tokens de cadenas de caracteres token = strtok(cadena, delimitadores); while ( token ) { printf("%s\n", token); token = strtok(NULL, delimitadores); } } Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid Lectura de tokens de cadenas de caracteres (II) 18 • La función strtok (de <string.h> #include <stdio.h> #include <string.h> void main() { FILE *fichero = NULL; char linea[256] char *delimitadores = " ,\t"; char *token = NULL; fichero = fopen("C:/miFichero.txt", "r"); if ( fichero ) { while ( !feof(fichero) ) { fgets(linea, 256, fichero); // Leemos la proxima linea // Leemos tokens de la linea token = strtok(linea, delimitadores); while ( token ) { printf("%s\n", token); token = strtok(NULL, delimitadores); } } fclose(fichero); } } Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid Programación I Escuela Politécnica Superior Universidad Autónoma de Madrid 17