Sunteți pe pagina 1din 3

ARCHIVOS.

Un archivo es un conjunto de datos que esencialmente se define para ser almacenado en memoria externa y por lo tanto el contenido de un archivo no se destruye al finalizar el programa que lo utiliza. ESTRUCTURA INTERNA DE UN ARCHIVO EN C. ARCHIVOS BINARIOS. Los archivos se clasifican en dos tipos: 1) Archivos de texto: poseen texto puro, por ejemplo los archivos fuente de cada programa. Se trata de una coleccin de los caracteres ASCII de cada letra, numero o cualquier smbolo y que tiene la particularidad de poderse leer directamente con los comandos de inspeccin de un archivo del Sistema Operativo que se trate (por ej, type para DOS, etc.) 2) Archivos binarios: contienen secuencias o bloques de valores binarios, que representan informacin grabada por el usuario. Estos archivos pueden guardar elementos del tipo que el usuario desee. Es comn que posean registros, debido a que el registro es una estructura de datos que permite describir muy bien a cualquier entidad de la cual se quiera almacenar datos. Un archivo binario puede ser de cualquier tipo de datos: enteros, flotantes, carcter, etc. Un programa slo puede procesar datos que se encuentran en la memoria principal. Como la informacin de los archivos se encuentra en discos se debern seguir los pasos adecuados para transportar los registros desde la memoria externa (disco) a la memoria principal, un registro por vez. Lectura de un registro es la operacin de tomar un registro del archivo en disco y copiarlo en memoria. Escritura de un registro es la operacin de grabar en el archivo un registro que est en memoria. Para que la lectura y grabacin puedan hacerse, debe establecerse una comunicacin entre la memoria y el disco donde est el archivo, lo cual se hace a travs de un canal de comunicacin. Cuando un programa en memoria quiere acceder a un archivo en disco debe definir un rea de memoria para manejo del archivo, que en realidad es una variable registro con varios campos. En esa variable tambin se define otros campos para almacenar informacin que luego ser necesaria para el manejo del archivo. Esos campos son automticamente inicializados por el lenguaje. En una de esas variables se mantiene el ndice de registro activo que indica cul registro ser copiado en memoria si se hace una lectura, o cul ser sobreescrito si se hace una escritura. El ndice de registro de archivo nos dice la posicin en donde se har la prxima lectura o escritura. La funcin fopen (file open) crea la variable para gestin del archivo y abre el canal de comunicacin entre memoria y disco. Fopen reserva una zona de memoria para alojar la variable de gestin de archivo, inicializa los campos de esa variable, abre el canal, y retorna la direccin de memoria de la variable de gestin creada. NOCION DE VARIABLE PUNTERO. Todo Sistema Operativo guarda locaciones o direcciones de memoria para las variables que fueron declaradas. Estas direcciones, estn numeradas, tal como si fueran el "domicilio" de cada una. A su vez, estas direcciones (numricas) pueden ser almacenadas en otras variables que puede manejar el usuario. Estas variables son especiales y se denominan variables punteros. Es decir, pueden almacenar una direccion de memoria de otra variable. Como Fopen retorna una direccin de memoria, el programa debe tener declarada una variable capaz de contener esa direccin. Una variable capaz de realizar este proceso es una variable puntero. Cuando un puntero contiene la direccin de memoria de otra variable, se dice que el puntero apunta a la variable. Declaracin de un puntero: se escribe el tipo de la variable a la que se quiere apuntar y luego el nombre del puntero pero precedido por el asterisco. El tipo de la variable a la cual apuntar el puntero, se le llama tipo base del puntero. Ej: int *p; {la variable puntero p apunta a una variable de tipo int. El tipo base es int} Para declarar un puntero que pueda contener la direccin de la variable de gestin de un archivo, slo debe tenerse en cuenta que el tipo base de ese puntero debe ser del tipo FILE. DECLARACION DEL PUNTERO A LA VARIABLE DE GESTION DEL ARCHIVO. Ejemplificaremos la declaracin con el siguiente bloque de programa: # include <stdio.h> struct alumnos { int leg; char nombre [25]; float promedio; }; main () { FILE *m; /*m es la variable puntero a FILE*/ alumnos r; }

Tenga en cuenta, que no se declara un archivo, sino un puntero para guardar la direccin de la variable de gestin de un archivo. Todas las funciones para acceder y manejar el contenido de un archivo, requieren que se pase como parmetro el puntero a la variable de gestin, y luego cada funcin accede al archivo en disco usando la informacin propia de ella. APERTURA DEL ARCHIVO. La apertura de un archivo se hace a travs de la funcin fopen que se encarga de crear la variable de gestin y abrir el canal. La funcin fopen recibe dos parmetros de tipo cadena de caracteres. El primero es el nombre que tiene el archivo en disco (puede incluir la unidad de disco y el camino de directorio). El segundo parmetro es un cdigo de caracteres que indica la forma de abrir el archivo: rb: slo lectura. El archivo debe existir, caso contrario retorna NULL wb: Solo escritura. Si no existe el archivo lo crea, caso contrario borra su contenido y lo abre vaco. ab: slo escritura. Si no existe el archivo lo crea, caso contrario no lo destruye. Los registros que se graban lo hacen al final. r+b: Lectura y escritura. El archivo debe existir previamente. w+b: Lectura y escritura. Si no existe el archivo lo crea, caso contrario lo borra y lo abre vaco. a+b: Lectura y escritura. Si no existe el archivo lo crea, caso contrario no lo borra. Aade al final. CIERRE DE ARCHIVOS. Esta operacin equivale a destruir la variable de gestin asignada al archivo, guardar en el archivo en disco la informacin que todava estuviera en memoria y cerrar el canal de comunicacin con el disco. La funcin para realizar esto es fclose() la cual toma como parmetro el puntero a la variable de gestin del archivo que se quiere cerrar. ESCRITURA DE UN REGISTRO EN UN ARCHIVO. Escribir un registro en un archivo equivale a grabar dicho registro en el archivo, el cual debe estar abierto en un modo que permita la escritura. El registro se grabar en la posicin que indique en ese momento el puntero de registro activo del archivo, luego ese puntero se incrementa en uno automticamente. La funcin usada para grabar un registro es fwrite() que recibe 4 parmetros. A los fines de interpretar el significado de los parmetros veamos el siguiente ejemplo:

main() { FILE *m; alumno r; m=fopen (maestro.dat, ab); if (m == NULL) printf (no se pudo abrir el archivo); else { scanf (%d,&r.legajo); scanf (%s,&r.nombre); scanf(%f,&r.promedio);
1 2 3 4

fwrite (&r, sizeof (alumno), 1, m); fclose (m); } } Parmetro 1: direccin de la variable cuyo contenido se quiere grabar en el archivo (& indica que se toma la direccin de la variable). Parmetro 2: tamao en bytes de la variable que se quiere grabar. Parmetro 3: cantidad de veces que el valor de la variable ser grabado en el archivo. Parmetro 4: puntero a la variable de gestin del archivo en donde se har la grabacin. LECTURA DE UN REGISTRO DE UN ARCHIVO. Leer un registro es tomar una copia del registro sealado por el puntero de registro activo y llevarlo a una variable de memoria. Luego, el puntero de registro activo se incrementa en uno automticamente. Para hacer una lectura se usa la funcin fread() y sus parmetros son anlogos a los de fwrite().

Es decir, que esta funcin lee de un archivo N bloques de bytes y los almacena en un buffer. El nmero de bytes de cada bloque (tamao) se pasa como parmetro al igual que el nmero de bloques y la direccin del buffer donde se almacena.. DETERMINACION DE FIN DE ARCHIVO. La funcin feof() recibe como parmetro el puntero a la variable de gestin de un archivo y retorna un uno si el puntero de registro activo es igual al tamao del archivo o devuelve un cero en caso contrario. Es decir, que si devuelve uno, significa que el puntero de registro activo lleg al final del archivo. REPOSICIONAMIENTO DE REGISTRO ACTIVO ACCESO DIRECTO Es imprescindible que el programador pueda acceder a cierto y determinado registro dentro de un archivo, y para ello es necesario poder cambiar el valor del puntero de registro activo. La funcin fseek devuelve un valor de tipo int; si se realiz el posicionamiento, la funcin devuelve cero (0), caso contrario devuelve uno (1). Esta funcin recibe 3 parmetros: el primero es el puntero al buffer del archivo que se quiere acceder, el segundo es el nmero del byte que se quiere acceder dentro del archivo, a partir de la posicin indicada por el tercer parmetro. El tercer parmetro puede ser 0, 1 2. Estos valores, se representan con las siguientes constantes y a continuacin se detalla su significado: Constante SEEK_SET SEEK_CUR SEEK_END Valor 0 1 2 Significado Reposiciona comenzando desde el principio del archivo. Reposiciona comenzando desde la posicin actual del puntero de registro activo. Reposiciona comenzando desde el final del archivo

fseek , a travs del segundo parmetro, salta a la direccin de un byte determinado. Para realizar este clculo se multiplica el nmero relativo del registro que se quiere acceder por el tamao en bytes de un registro del archivo (que se calcula con sizeof). Por ejemplo, si se desea acceder al 3 registro comenzando desde cero, la instruccin sera: fseek (m,2*sizeof(alumno),SEEK_SET) OBTENCION DEL VALOR DEL PUNTERO DE REGISTRO ACTIVO. Para verificar cul es el valor del puntero del registro activo se usa la funcin ftell que toma como parmetro un puntero al buffer de un archivo, y retorna un valor de tipo long que indica la posicin actual del puntero de registro activo desde el principio del archivo. Esta funcin retorna el valor -1L (o sea, el valor -1 en formato long) si se produce algn error al intentar determinar el valor del puntero. REINICIALIZACION DE UN ARCHIVO Cuando se desea volver a procesar un archivo, es necesario reubicar el puntero de registro activo al principio del archivo. Esta accin puede hacerse de varias formas: a) cerrar el archivo y volver a abrirlo b) usar fseek indicando que se posicione en el byte cero desde el principio del archivo c) usar la funcin rewind que es anloga a llamar a fseek.

S-ar putea să vă placă și