Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
1 PROGRAMACIÓN Y FUNDAMENTOS DE ALGORÍTMICA ARCHIVOS AGENDA Introducción Archivo Clasificación Flujo o stream Variable Puntero a archivo Apertura de archivos Cierre de archivos Escritura Lectura Final de flujo Error en operación de archivo Grabación de datos en buffer Referencia del contenido de un buffer Ejemplo 2 INTRODUCCIÓN Muchas veces necesitamos almacenar cierta cantidad de datos de forma permanente. La memoria principal es volátil, escasa y cara. De modo que cuando necesitamos guardar nuestros datos durante cierto tiempo tenemos que recurrir a sistemas de almacenamiento externo (memoria secundaria). 3 ARCHIVO Un archivo es una secuencia de datos almacenados en un medio persistente que están disponibles para ser utilizados por un programa. Todos los archivos tienen un nombre y una ubicación dentro del sistema de archivos del sistema operativo. Los datos en un archivo siguen estando presentes después de que termina el programa que lo ha creado. Un programa puede guardar sus datos en archivos para usarlos en una ejecución futura, e incluso puede leer datos desde archivos creados por otros programas. 4 ARCHIVO Un programa no puede manipular los datos de un archivo directamente. Para usar un archivo, un programa siempre debe abrir el archivo y asignarlo a una variable, que llamaremos el archivo lógico. Todas las operaciones sobre un archivo se realizan a través del archivo lógico. Su tamaño sólo está limitado por el espacio libre disponible en el dispositivo correspondiente. 5 ARCHIVOS EN C++ C ve cada uno de los archivos simplemente como un grupo secuencial de bytes. Cada archivo termina con un marcador de fin de archivo o un número de bytes especificado registrado en una estructura de datos. En C++, un archivo es un concepto lógico que puede aplicarse a muchas cosas desde archivos de disco hasta terminales. Un flujo está asociado con un archivo realizando una operación de apertura (open), entonces se pueden intercambiar la información entre él y el programa. Se separa un flujo de un archivo específico a través de la operación close. Al salir de un archivo abierto, el cierre provoca que si hay contenidos de su flujo asociado, se escriban en el dispositivo externo. 6 CLASIFICACIÓN a) Dependiendo de la dirección del flujo de datos: - De entrada: los datos se leen por el programa desde el archivo. - De salida: los datos se escriben por el programa hacia el archivo. - De entrada/salida: los datos pueden ser escritos o leídos. 7 CLASIFICACIÓN b) Dependiendo del tipo de valores permitidos a cada byte: - De texto: están compuestos únicamente por textos, sólo caracteres. - Binarios: contienen información de cualquier tipo, codificada en forma binaria para el propósito de almacenamiento y procesamiento en computadores. 8 CLASIFICACIÓN c) Según el tipo de acceso: - Archivos secuenciales: imitan el modo de acceso de los antiguos archivos secuenciales almacenados en cintas magnéticas. - Archivos de acceso aleatorio: permiten acceder a cualquier punto de ellos para realizar lecturas y/o escrituras. 9 CLASIFICACIÓN d) Según la longitud de registro: - Longitud variable: en estos archivos cada registro es de longitud diferente; en realidad, en este tipo de archivos no tiene sentido hablar de longitud de registro, podemos considerar cada byte como un registro. - Longitud constante: en estos archivos los datos se almacenan en forma de registro de tamaño constante. - Mixtos: en ocasiones pueden crearse archivos que combinen los dos tipos de registros, algunos software usan registros de longitud constante, pero añade un registro especial de cabecera al principio para definir, entre otras cosas, el tamaño y el tipo de registros. 10 FLUJO, CORRIENTE O STREAM Los flujos dan canales de comunicación entre el archivo y el programa. Por ejemplo, el flujo de entrada estándar permite que un programa lea datos desde el teclado, el flujo de salida estándar permite que un programa imprima datos en la pantalla. Un flujo se relaciona con un archivo utilizando una operación de apertura y se desliga del archivo con una operación de cierre. 11 TIPOS a) Flujos de texto: es una secuencia de caracteres organizados en líneas terminadas por un carácter de nueva línea (en el estándar ANSI es opcional). b) Flujos binarios: es una secuencia de bytes que tienen una correspondencia uno a uno con un dispositivo externo. Así que no tendrá lugar ninguna traducción de caracteres. Además, el número de bytes escritos (leídos) será el mismo que los encontrados en el dispositivo externo. 12 DECLARACIÓN DE VARIABLE PUNTERO DE ARCHIVO Sintaxis : FILE *flujo Propósito : Identifica un archivo especifico de disco y se usa por su flujo asociado para dirigir cada una de las funciones de memoria intermedia de E/S al lugar donde se realizan las operaciones. Ejemplo : FILE *fichero; Un puntero de archivo es un puntero a la información que define varios aspectos del archivo, incluyendo su nombre, estado y posición actual. Un puntero de archivo es una variable de tipo FILE. Con objeto de leer o escribir archivos, el programa necesita utilizar punteros de archivo. 13 APERTURA DE ARCHIVOS Sintaxis : flujo = fopen(char *nombre, char *modo); Propósito : Abrir un flujo para enlazar un archivo con un flujo y retornar el puntero de archivo asociado con un archivo. Ejemplo : archivo = fopen(“d:ficha.dat”,”w”); La función fopen() devuelve la dirección cero o NULL si la operación de apertura falla (por ejemplo un disco lleno o protegido contra escritura antes de comenzar a escribir en él), o un valor (dirección) distinto al correcto. 14 APERTURA DE ARCHIVOS Si la operación es correcta, a partir de este instante el archivo queda referido por el apuntador flujo hasta el momento en que se cierra. Los parámetros de entrada son: a) nombre: es una cadena de caracteres que contiene un nombre de archivo válido para el sistema operativo y también pueden incluir la especificación del camino completo. b) modo: es una cadena de caracteres que contiene el estado deseado de apertura y especifica el tipo de archivo que se abrirá o se creará uno nuevo y el tipo de dato que puede contener: texto (t) o binario (b). 15 MODO 16 Modo Significado “w” “r” “a” “wb” “rb” “ab” “w+” “r+” “a+” “w+b” “r+b” “a+b” “wt” “rt” “at” “w+t” “r+t” “a+t” Crear un nuevo archivo de texto para escritura (o se sobrescribe si ya existe) Abrir un archivo de texto para lectura (el archivo debe existir) Añadir a un archivo de texto (se abre para escritura y el cursor se sitúa al final del archivo. Si el fichero no existe, se crea) Crear un archivo binario para escritura Abrir un archivo binario para lectura Añadir a un archivo binario Crear un archivo nuevo para leer/escribir (o se sobrescribe si ya existe) Abrir un archivo para leer/escribir (el archivo debe existir) Añadir a un archivo para leer/escribir (el cursor se sitúa al final del fichero, Si el fichero no existe, se crea Crear un archivo binario para leer/escribir Abrir un archivo binario para leer/escribir Añadir a un archivo binario para leer/escribir Crear un archivo de texto para escribir Abrir un archivo de texto para leer Añadir a un archivo de texto Crear un archivo de texto para leer/escribir Abrir un archivo de texto para leer/escribir Añadir o crear a un archivo de texto para leer/escribir CIERRE DE ARCHIVOS Sintaxis : int fclose(FILE *flujo); Propósito : Cerrar un flujo que fue abierto por una llamada a fopen() y antes de abandonar el programa, finalizar su vínculo con nombre Ejemplo : fclose(fichero); Si fclose() devuelve un valor cero (0) significa que la operación de cierre se ha realizado con éxito. Si ha habido algúnerror, el valor de retorno es la constante EOF. Al cerrar un archivo almacena los datos que aún están en el buffer de memoria, y actualiza algunos datos de la cabecera del archivo que mantiene el sistema operativo. 17 LECTURA DE ARCHIVOS Se puede usar la función de lectura (archivos abiertos en modo r): Sintaxis : int fread(void *puntero, int longitud, int registros, FILE *corriente); Propósito : Leer desde un flujo uno o más registros de una longitud constante, y los almacena en una dirección de memoria. Devuelve un valor menor o igual al número de datos leídos (no el número de bytes) y si está al final del archivo devuelve 0. Ejemplo : fread(dirección, tamaño, número, fichero); Los parámetros son: un puntero a la zona de memoria donde se almacenarán los datos leídos, la longitud de cada registro, el número de registros a leer y un puntero a la estructura FILE del archivo del que se hará la lectura. 18 ESCRITURA DE ARCHIVOS Para escribir en un archivo (abierto en los modos “w” o “a”) se puede utilizar: Sintaxis : int fwrite(void *puntero, int longitud, int registros, FILE *flujo); Propósito : Escribir hacia un flujo uno o más registros de una longitud constante almacenados a partir de una dirección de memoria determinada. Devuelve un valor igual al número de registros escritos (no el número de bytes) o EOF en caso de error. Ejemplo : fwrite(dirección, longitud, número, fichero); Los parámetros son: un puntero a la zona de memoria donde se almacenarán los datos leídos, el tamaño de cada registro, el número de registros a leer y un puntero a la estructura FILE del archivo del que se hará la lectura. 19 FINAL DE UN FLUJO Sintaxis : int feof(FILE *flujo); Propósito : Comprobar si se ha llegado al final de un flujo, en una lectura que efectuamos en éste. El valor de retorno es distinto de cero sólo si no se ha alcanzado el fin del archivo. Se puede aplicar este método tanto para los archivos de texto como a los binarios. Ejemplo : feof(fichero); Muy frecuentemente deberemos trabajar con todos los valores almacenados en un archivo de forma secuencial, la forma que suelen tener los bucles para leer todos los datos de un archivo es permanecer leyendo mientras no se detecte el fin del archivo. 20 ERROR EN OPERACIÓN DE ARCHIVO Sintaxis : int ferror(FILE *flujo); Propósito : Determinar si una operación con archivos produce un error. Devuelve verdad si ha ocurrido un error durante la última operación de archivo y devuelve falso si tuvo éxito la operación. Ejemplo : ferror(fichero); 21 GRABACIÓN DE DATOS DE UN BUFFER Sintaxis : int fflush(FILE *corriente); Propósito : Forzar la grabación de los datos acumulados en el buffer de salida del archivo asociado a él. El valor de retorno es cero si la función se ejecutó con éxito, y EOF si hubo algún error. El parámetro de entrada es un puntero a la estructura FILE del archivo del que se quiere vaciar el buffer. Si es NULL se hará el vaciado de todos los archivos abiertos Ejemplo : fflush(fichero); 22 REFERENCIA DEL CONTENIDO DE UN FLUJO Sintaxis : int fseek(FILE *flujo, long int desplazamiento, int origen); Propósito : Ubicar el cursor del archivo para leer o escribir, que referencia el contenido del flujo especificado, en la posición marcada por los argumentos de llamada. El valor de retorno es cero si la función tuvo éxito, y un valor distinto de cero si hubo algún error Se usa en las E/S de acceso directo. Ejemplo : fseek(fichero, 128, 0); 23 PARÁMETROS Los parámetros de entrada son: un puntero a una estructura FILE del archivo en el que queremos cambiar el cursor de lectura/escritura, el valor del desplazamiento y el punto de origen desde el que se calculará el desplazamiento. El parámetro origen puede tener tres posibles valores: - SEEK_SET o 0, el desplazamiento se cuenta desde el principio del archivo. El primer byte del archivo tiene un desplazamiento cero. - SEEK_CUR o 1, el desplazamiento se cuenta desde la posición actual del cursor. - SEEK_END o 2, el desplazamiento se cuenta desde el final del archivo. El desplazamiento es el número de bytes desde el origen hasta alcanzar la nueva posición. 24 EJEMPLO 25 PREGUNTAS 26 PROBLEMA En código que presentará el docente realice los cambios que indique. 27 EN RESUMEN Archivo Clases Apertura Cierre Lectura Escritura 28
Compartir