Archivos secuenciales indexados

32
ARCHIVOS SECUENCIALES INDEXADOS

Transcript of Archivos secuenciales indexados

Page 1: Archivos secuenciales indexados

ARCHIVOS SECUENCIALES INDEXADOS

Page 2: Archivos secuenciales indexados

UN ARCHIVO DE ORGANIZACIÓN SECUENCIAL INDEXADO CONSTA DE LAS SIGUIENTES PARTES LAS CUALES SON:

Área de índices Área

principal

Archivo de desbordamiento

u Overflow

Page 3: Archivos secuenciales indexados

1. ÁREA DE ÍNDICES:LOS REGISTROS DE ESTA ÁREA ESTÁN FORMADOS

POR DOS CAMPOS QUE PERMITEN IDENTIFICAR CADA REGISTRO DE FORMA ÚNICA:

EL PRIMERO CONTIENE UNA CLAVE DEL ÚLTIMO REGISTRO DE CADA BLOQUE.

EL SEGUNDO CONTIENE EL APUNTADOR AL ARCHIVO PRINCIPAL.

POR EJEMPLO, SI SE QUIEREN GRABAR LOS ESTUDIANTES DE CIERTA ESCUELA EN UN ARCHIVO SECUENCIAL INDEXADO, EL CAMPO ÍNDICE QUE SE PUEDE ELEGIR ES EL NOMBRE DEL ESTUDIANTE (TAMBIÉN SE PUEDE ELEGIR EL NÚMERO DE CARNET DEL ESTUDIANTE).

Page 4: Archivos secuenciales indexados

2. ÁREA PRINCIPAL: ES LA PARTE DEL FICHERO DONDE SE GUARDAN

LOS REGISTROS ORDENADOS POR EL VALOR DEL CAMPO “CLAVE”. CONTIENE UN CAMPO QUE APUNTA AL ARCHIVO DE DESBORDAMIENTO EL CUAL SIRVE PARA INSERTAR REGISTROS.SU ACCESO SE REALIZA MEDIANTE DOS OPERACIONES: PRIMERO, BUSCANDO EN EL BLOQUE DEL REGISTRO. LUEGO ANALIZA SECUENCIALMENTE ESE BLOQUE HASTA

LOCALIZAR EL REGISTRO DESEADO.

Page 5: Archivos secuenciales indexados
Page 6: Archivos secuenciales indexados

3. ÁREA DE DESBORDAMIENTO U OVERFLOW: TRAS COMPLETAR EL ÁREA PRIMARIA, LOS

REGISTROS AÑADIDOS POSTERIORMENTE QUE NO PUEDEN SER REALIZADAS EN EL ÁREA PRIMARIA, SERÁN ENVIADOS AL ÁREA DE OVERFLOW.

EN ESTE LOS REGISTROS SE PRESENTAN COMO UNA LISTA ENCADENADA, EN QUE EL PUNTERO AL PRÓXIMO REGISTRO ESTÁ COMPUESTO POR LA PISTA Y EL LUGAR QUE OCUPA EL REGISTRO DENTRO DE LA PISTA.

ESTA LISTA SE MANTIENE ORDENADA POR CLAVE.

Page 7: Archivos secuenciales indexados

ARCHIVO DE ORGANIZACIÓN SECUENCIAL INDEXADO1)

2)

3)

Page 8: Archivos secuenciales indexados

EJEMPLO:

Page 9: Archivos secuenciales indexados

VENTAJAS

BÚSQUEDA MAS RÁPIDAS GRACIAS A LA UTILIZACIÓN DE UN ÍNDICE.

SE PUEDEN ACTUALIZAR LOS REGISTROS EN EL MISMO FICHERO NUEVO PARA EL PROCESO DE ACTUALIZACIÓN.

Page 10: Archivos secuenciales indexados

INCONVENIENTES

OCUPA MÁS ESPACIO EN EL DISCO QUE LOS FICHEROS SECUENCIALES, DEBIDO AL USO DEL ÁREA DE ÍNDICES.

TIENDE TENDENCIAS A QUE AUMENTE EL TIEMPO MEDIO DE ACCESO A LOS REGISTROS, CUANDO SE PRODUCEN MUCHAS ALTAS NUEVAS CON CLAVES QUE HAY QUE INTERCALAR ENTRE LAS EXISTENCIAS, YA QUE AUMENTA EL ÁREA DE OVERFLOW.

Page 11: Archivos secuenciales indexados

PROCESO DE UN ARCHIVO SECUENCIAL INDEXADO

AL DISEÑAR UN ARCHIVO SECUENCIAL INDEXADO, LO PRIMERO QUE HAY QUE DECIDIR ES CUÁL VA A SER EL CAMPO CLAVE. LOS REGISTROS HAN DE SER GRABADOS EN ORDEN SECUENCIAL, Y SIMULTÁNEAMENTE A LA GRABACIÓN DE LOS REGISTROS, EL SISTEMA CREA LOS ÍNDICES EN ORDEN SECUENCIAL ASCENDENTE DEL CONTENIDO DEL CAMPO CLAVE.

Page 12: Archivos secuenciales indexados

SE DESARROLLAN LAS OPERACIONES (ALTAS, BAJAS, CONSULTAS…) PARA UN ARCHIVO CON ESTA ORGANIZACIÓN. TAMBIÉN ES NECESARIO CONSIDERAR EL INICIO Y LA SALIDA DE LA APLICACIÓN QUE PROCESA UN ARCHIVO INDEXADO, PARA CARGAR Y DESCARGAR, RESPECTIVAMENTE LA TABLA DE ÍNDICES.

Page 13: Archivos secuenciales indexados

TIPOS DE DATOSSE DECLARAN DOS TIPOS DE ESTRUCTURAS PARA REPRESENTAR EL REGISTRO DE DATOS Y EL ÍNDICE RESPECTIVAMENTE:

STRUCT ESTUDIANTE {INT CARNET;

STRING NOMBRE; };

STRUCT INDEX{INT CARNET;

INT POSICION; };

Page 14: Archivos secuenciales indexados

CREACIÓNESTA DECLARACIÓN DE LA VARIABLE PARA SWITCH CONTIENE

LA VARIABLE PARA ALMACENAR DATOS DE LA ESTRUCTURA ESTUDIANTE Y LA VARIABLE PARA ALMACENAR INDICE Y ALMACENAR TEMPORALMENTE (AUX), DURANTE LA BUSQUEDA.

INT MAIN(){

INT OPCION, BUS;ESTUDIANTE ALUMNO, AUXI;INDEX INDICE, AUX;

Page 15: Archivos secuenciales indexados

A CONTINUACIÓN SE ABRE UN DO WHILE PARA REPETIR EL MENÚ CADA VEZ QUE SEA NECESARIO PARA REALIZAR LAS DISTINTAS OPERACIONES DEL PROGRAMA.

DO{SYSTEM("CLS");

DECLARAMOS EL ARCHIVO PARA ALMACENAR DATOS DEL ÁREA PRINCIPAL.

OFSTREAM DAT("DATOS.TXT", IOS::BINARY | IOS::APP);

DECLARAMOS EL ARCHIVO PARA ALMACENAR DATOS Y CLAVE DEL ÁREA DE ÍNDICE.

OFSTREAM IND("INDEX.TXT", IOS::BINARY | IOS::APP);

DECLARAMOS EL ARCHIVO PARA BUSCAR DATOS .

IFSTREAM INDIC("INDEX.TXT", IOS::BINARY);

REMOVE("DATOS.TXT");

Page 16: Archivos secuenciales indexados

SE COLOCA UN COUT CON LA INTENCIÓN DE COLOCAR UN TEXTO DE BIENVENIDA A TODO USUARIO QUE EJECUTE EL PROGRAMA.

COUT<<"*** BIENVENIDOS ***"<<ENDL<<ENDL;

SE CREA LOS COUT RESPECTIVOS PARA MOSTRAR UN MENÚ DE OPCIONES PARA EL SWITCH QUE HEMOS DECLARADO ANTERIORMENTE ASI A LA HORA DE EJECUTAR EL PROGRAMA, EL USUARIO PUEDA SELECCIONAR LA OPCIÓN QUE NECESITE.

COUT<<"1. INGRESAR DATOS DE ESTUDIANTE"<<ENDL;COUT<<"2. BUSCAR DATOS DE ESTUDIANTE"<<ENDL;COUT<<"3. BORRAR REGISTROS"<<ENDL;COUT<<"4. SALIR DEL PROGRAMA"<<ENDL;

EN LAS SIGUIENTES LÍNEAS COLOCAMOS UN COUT, CON LA INTENCIÓN DE MOSTRAR EN LA CONSOLA UN TEXTO INDICANDO LA SELECCIÓN DE UNA OPCIÓN. LUEGO SE AGREGA UN CIN PARA INDICAR DONDE SE ALMACENA LA OPCIÓN QUE SE ESCRIBA O INDIQUE.

COUT<<ENDL<<"SELECCIONE UNA OPCION: ";CIN>>OPCION;COUT<<ENDL;

Page 17: Archivos secuenciales indexados

ESTE IF ES PARA QUE ENTRE AL SWITCH SOLO SI VA A SER USADO CON LA CONDICIÓN QUE EL NÚMERO DE OPCIÓN ESTE ENTRE 1 (INGRESAR) Y 3 (BORRAR).

IF(OPCION>0 && OPCION<4){

INICIO DEL SWITCH.

SWITCH(OPCION){

INICIA CON OPCIÓN UNO EN CASO DE SER SELECCIONADO PARA INGRESAR DATOS.

CASE 1:

ESTA CONDICIÓN SIRVE PARA VER SI LOS ARCHIVOS A LOS CUALES VAMOS A ESCRIBIR SE ABREN CORRECTAMENTE.

IF(!DAT && !IND){COUT<<"ERROR AL ABRIR ARCHIVO"<<ENDL;}ELSE{

Page 18: Archivos secuenciales indexados

EN CASO DE QUE SE EJECUTE O SE ABRA EL ARCHIVO SIN NINGÚN PROBLEMA ENTRARÍA AL SIGUIENTE PASO.

EN ESTAS LÍNEAS DE CÓDIGO SE HACE USO DEL COUT QUE MUESTRA EN LA CONSOLA EL TEXTO DANDO INSTRUCCIONES SOBRE EL INGRESO DEL CARNET Y EL CIN PARA ALMACENAR LA INFORMACIÓN EN LA VARIABLE ALUMNO. ESTO HACE QUE PODAMOS INGRESAR DATOS Y ALMACENARLOS EN LA VARIABLE ALUMNO.

COUT<<"INGRESE CARNET: ";CIN>>ALUMNO.CARNET;COUT<<ENDL;

EN LAS SIGUIENTES LÍNEAS ABRIMOS UN WHILE LLAMANDO Y DETERMINANDO LA CANTIDAD DE BITES QUE OCUPA CADA BLOQUE DE INFORMACIÓN.

WHILE(!INDIC.EOF()){

INDIC.READ((CHAR*) &AUX, SIZEOF(STRUCT INDEX));

Page 19: Archivos secuenciales indexados

CREAMOS UN IF.

IF (ALUMNO.CARNET==AUX.CARNET){

COUT<<"EL ARCHIVO YA EXISTE, POSICION: "<<AUX.POSICION;COUT<<ENDL;

BUS=10;

CIERRA IF

}

CIERRA WHILE

}

CIERRA ARCHIVO INDC DE BUSQUEDA

INDIC.CLOSE();

Page 20: Archivos secuenciales indexados

ABRIMOS UN IF .

IF(BUS!=10){

A CONTINUACIÓN SE CREAN LAS SIGUIENTES LÍNEAS DE CÓDIGO PARA PODER PEDIR, INGRESAR Y ALMACENAR LA INFORMACIÓN DE CADA ALUMNO.

COUT<<"INGRESE NOMBRE: ";CIN>>ALUMNO.NOMBRE;COUT<<ENDL;

COUT<<"INGRESE EDAD: ";CIN>>ALUMNO.EDAD;COUT<<ENDL;

COUT<<"INGRESE CARRERA: ";CIN>>ALUMNO.CARRERA;COUT<<ENDL;

Page 21: Archivos secuenciales indexados

EN LA SIGUIENTE LÍNEA PERSISTIMOS LA ESTRUCTURA EN EL ARCHIVO CREADO PARA DATOS.

DAT.WRITE((CHAR*) &ALUMNO, SIZEOF(STRUCT ESTUDIANTE));

EN ESTA LÍNEA SE CUMPLE CON LA FUNCIÓN DE COLOCAR EL CURSO AL FINAL DEL ARCHIVO PARA VER LA UBICACIÓN.DAT.SEEKP(0, IOS::END);

SE LE ASIGNA A LA VARIABLE INDICE EL VALOR DEL CAMPO CLAVE.

INDICE.CARNET=ALUMNO.CARNET;

SE DETERMINA LA POSICIÓN DIVIDIENDO ENTRE EL TAMAÑO DEL ARCHIVO PARA ASI NOS DA VALORES DESDE 1

INDICE.POSICION=DAT.TELLP()/SIZEOF(STRUCT ESTUDIANTE);

PERSISTIMOS LA ESTRUCTURA DEL INDICE EN EL ARCHIVO.

IND.WRITE((CHAR*) &INDICE, SIZEOF(STRUCT INDEX));

Page 22: Archivos secuenciales indexados

ESTÁ LÍNEA NOS MUESTRA LA POSICIÓN EN LA QUE SE GUARDA LA ESTRUCTURA.

COUT<<"GUARDADO EN POSICION: "<<"["<<INDICE.POSICION<<"]"<<ENDL;

ASÍ MISMO SE DEBE DE CERRAR AMBOS ARCHIVOS AL YA HABER TERMINADO DE INGRESAR DATOS Y HABER GUARDADO LA ESTRUCTURA Y ESTO SE LOGRA HACIENDOLO DE LA SIGUIENTE FORMA:DAT.CLOSE();IND.CLOSE(); }

LA SIGUIENTE LÍNEA SOLO DETIENE EL PROGRAMA Y EL BREAK FINALIZA EL CASO.

SYSTEM("PAUSE"); BREAK;

Y CERRAMOS IF EN CASE 1.

}

Page 23: Archivos secuenciales indexados

EMPIEZA EL CASO 2 EL DE BÚSQUEDA DE ARCHIVO.

CASE 2:

SE COLOCA UNA VARIABLE QUE GUARDA LO QUE QUERAMOS BUSCAR. EN ESTE CASO LA CLAVE VA A SER EL CARNET.

INT BUSCAR;

COUT<<"ESCRIBA CARNET DE ALUMNO A BUSCAR: ";CIN>>BUSCAR;

ABRIMOS UN WHILE QUE VA A REPETIR MIENTRAS NO SEA EL FINAL DEL ARCHIVO.

WHILE(!INDIC.EOF()){

LA SIGUIENTE LÍNEA PERMITE QUE SE LEA EL ARCHIVO Y GUARDA EN VARIABLE AUX.

INDIC.READ((CHAR*) &AUX, SIZEOF(STRUCT INDEX));

Page 24: Archivos secuenciales indexados

SE ABRE UN IF COMPARANDO SI LO QUE SE BUSCA ES IGUAL A LO DE LA VARIABLE AUX.

IF (BUSCAR==AUX.CARNET){

SI FUERE IGUAL SE ESCRIBIRÍA LO EN LA CONSOLA LO SIGUIENTE Y SI NO FUERE ASÍ SIGUE HASTA ENCONTRARLO .

COUT<<ENDL<<"POSICION: "<<AUX.POSICION; COUT<<ENDL<<ENDL;

COLOCAMOS UNA VARIABLE DE TIPO IFSTREAM PARA LEER EL ARCHIVO , EN EL CUAL SE ENCUENTRA LA INFORMACIÓN QUE BUSCAMOS.

IFSTREAM DATO("DATOS.TXT", IOS::BINARY);

BUS=AUX.POSICION-1;

DATO.SEEKG(SIZEOF(STRUCT ESTUDIANTE)*BUS, IOS::BEG);DATO.READ((CHAR*) &AUXI, SIZEOF(STRUCT ESTUDIANTE));

Page 25: Archivos secuenciales indexados

EN LAS SIGUIENTES LÍNEAS LLAMAMOS A CADA VARIABLE DE ALUMNO PARA PODER MOSTRAR LA INFORMACIÓN DEL ALUMNO QUE INDIQUE EL USUARIO.

COUT<<"CARNET: "<<AUXI.CARNET<<ENDL;COUT<<"NOMBRE: "<<AUXI.NOMBRE<<ENDL;COUT<<"EDAD: "<<AUXI.EDAD<<ENDL;COUT<<"CARRERA: "<<AUXI.CARRERA<<ENDL;

DATO.CLOSE();

LUEGO DEBEMOS DE DETENER EL PROGRAMA POR UN MOMENTO Y ESO LO LOGRAMOS COLOCANDO LA SIGUIENTE LÍNEA.

SYSTEM("PAUSE");

Page 26: Archivos secuenciales indexados

COMO SIGUIENTE PASO CERRAMOS IF COMPARACIÓN

}

CERRAMOS WHILE DE FINAL DEL ARCHIVO.

}

AL FINALIZAR LA OPERACIÓN SE CIERRA EL ARCHIVO PARA LA BÚSQUEDA.

INDIC.CLOSE();

SE CIERRA EL CASA DOS.

BREAK;

Page 27: Archivos secuenciales indexados

EMPIEZA EL CASO 3 QUE NOS PERMITIRÁ ELIMINAR DATOS.

CASE 3:BUS=0;IF(BUS==0){

SE CREAN VARIABLES DE TIPO IFSTREAM PARA LECTURA CON LA INTENCIÓN DE ABRIR LOS ARCHIVOS DE DATOS E INDÍCE Y PODER REALIZAR EL PROCESO DE ELIMINACIÓN DE DATOS.

IFSTREAM ELIMINAR("DATOS.TXT", IOS::BINARY);IFSTREAM ELIM_IND("INDEX.TXT", IOS::BINARY);OFSTREAM TEMPORAL("TEMP.TXT", IOS::BINARY | IOS::OUT);OFSTREAM TEMP_IND("TEMPI.TXT", IOS::BINARY | IOS::OUT);

Page 28: Archivos secuenciales indexados

CREAMOS UN IF EL CUAL NOS MOSTRARA DOS OPCIONES INDICÁNDONOS SI HAY ERROR AL ABRIR EL ARCHIVO O DE LO CONTRARIO PASARÍA A LA BÚSQUEDA DE LA INFORMACIÓN QUE VA A ELIMINARSE.

IF(!ELIMINAR || !ELIM_IND){

COUT<<"ERROR AL ABRIR EL ARCHIVO"<<ENDL;

}ELSE{

COUT<<"INGRESE EL NUMERO DE CARNET DEL ALUMNO QUE DESEA BORRAR: ";CIN>>OPCION;

WHILE(!ELIMINAR.EOF()){

ELIMINAR.READ((CHAR*) &AUXI, SIZEOF(STRUCT ESTUDIANTE));

Page 29: Archivos secuenciales indexados

A CONTINUACIÓN CREAMOS UN IF PARA MOSTRAR UN TEXTO EN LA CONSOLA INDICANDO LA ELIMINACIÓN DEL ARCHIVO DEL ÁREA PRINCIPAL..

IF(AUXI.CARNET==OPCION){

COUT<<"EL ARCHIVO SE HA ELIMINADO DE DATOS"<<ENDL;

}ELSE{

TEMPORAL.WRITE((CHAR*) &AUXI, SIZEOF(STRUCT ESTUDIANTE));

}}

Page 30: Archivos secuenciales indexados

A CONTINUACIÓN SE REALIZA EL PROCESO PARA LA ELIMINACIÓN DE LOS DATOS EN EL ÁREA DE ÍNDICE.

WHILE(!ELIM_IND.EOF()){

ELIM_IND.READ((CHAR*) &AUX, SIZEOF(STRUCT INDEX));

IF(AUX.CARNET==OPCION){

COUT<<"EL ARCHIVO SE HA ELIMINADO DE INDICE"<<ENDL;

}ELSE{

TEMP_IND.WRITE((CHAR*) &AUX, SIZEOF(STRUCT INDEX));

}}}

Page 31: Archivos secuenciales indexados

EN LAS SIGUIENTES LÍNEAS FINALIZAMOS EL PROCESO DE ELIMINACIÓN DE DATOS.

ELIMINAR.CLOSE();TEMPORAL.CLOSE();ELIM_IND.CLOSE();TEMP_IND.CLOSE(); }REMOVE("DATOS.TXT");REMOVE("INDEX.TXT");RENAME("TEMP.TXT", "DATOS.TXT");RENAME("TEMPI.TXT", "INDEX.TXT");

LA SIGUIENTE LÍNEA DETIENE EL PROGRAMA UN MOMENTO.

SYSTEM("PAUSE"); BREAK;

Page 32: Archivos secuenciales indexados

DEFAULT: BREAK;

CERRAMOS SWITCH.

}

CERRAMOS IF PARA ENTRAR A SWITCH}

} WHILE(OPCION>0 && OPCION!=4);

LA CONDICIÓN DEL DO WHILE ES QUE SE VA A REPETIR EL MENÚ MIENTRAS LA VARIABLE OPCIÓN SE MAYOR A CERO(0) Y TAMBIÉN SEA DIFERENTE DE 4, EN CASO SEA 0 O CUATRO SE SALE DEL PROGRAMA

SYSTEM("PAUSE");

AQUÍ FINALIZA EL PROGRAMA

}