From 66e1ded75dc357eed7700388ca0fca71dd3e8d4f Mon Sep 17 00:00:00 2001 From: jdg Date: Fri, 3 Sep 2021 17:42:38 +0200 Subject: [PATCH] First commit 31/01/1996 --- BDATOS.CPP | 734 +++++++++++++++++++++++++++++++++++++++++++++++++++++ BDATOS.EXE | Bin 0 -> 34586 bytes BDATOS.HH | 144 +++++++++++ BDATOS.PRJ | Bin 0 -> 5456 bytes D.BAT | 1 + DUMMY.FIL | Bin 0 -> 245 bytes PDATOS.CPP | 190 ++++++++++++++ PDATOS.EXE | Bin 0 -> 13940 bytes PRUEBA.CPP | 297 ++++++++++++++++++++++ 9 files changed, 1366 insertions(+) create mode 100644 BDATOS.CPP create mode 100644 BDATOS.EXE create mode 100644 BDATOS.HH create mode 100644 BDATOS.PRJ create mode 100644 D.BAT create mode 100644 DUMMY.FIL create mode 100644 PDATOS.CPP create mode 100644 PDATOS.EXE create mode 100644 PRUEBA.CPP diff --git a/BDATOS.CPP b/BDATOS.CPP new file mode 100644 index 0000000..9c6bb6e --- /dev/null +++ b/BDATOS.CPP @@ -0,0 +1,734 @@ +#include +#include +#include +#include + +#define __BDatos_CPP +#include "d:\program\src_dos\libs\bdatos\BDatos.hh" + + +// ÚÄÄÄÄÄÄÄÄÄÄÄÄ¿ +#define PROG_NAME "BDatos::JD::" +// ÀÄÄÄÄÄÄÄÄÄÄÄÄÙ +#define VER_HI 1 +#define VER_LOW 0 +#define ARCH_LEN 12 + +#define FALSO 0 +#define CIERTO 1 + +typedef struct +{ + char code; + long pos; +} BTree; + + /**************************************************************************\ +| | +| Contructor de Clase | +| | +| Descripcion: | +| Se encarga de poner a cero todas las variables utilizadas | +| | +| | +| Entradas: (ninguna) | +| | +| Salidas: (ninguna) | +| | + \**************************************************************************/ +BDatos::BDatos() +{ + BDatosHeader.NRegistros = 0; + BDatosHeader.NRegTotal = 0; + BDatosHeader.SizeReg = 0; + BDatosHeader.VerHi = VER_HI; + BDatosHeader.VerLow = VER_LOW; + BDatosHeader.Eof_Code = 26; + + strcpy( BDatosHeader.NBD, "BDatos::JD::" ); + + memset( BDatosHeader.MyHeader.ProgName, 32, sizeof(char)* 15 ); + BDatosHeader.MyHeader.VerHi = 0; + BDatosHeader.MyHeader.VerLow = 0; + + memset( BDatosHeader.MyHeader.Other, 32, sizeof(char)*200 ); + + NRegActual = 0; + lError = 0x00; + *cError = 0x00; + rError = ERROR; +} + + /**************************************************************************\ +| | +| Destructor de clase | +| | +| Descripcion: | +| Finaliza las operaciones pendientes. | +| | +| | +| Entradas: (ninguno) | +| | +| Salidas: (ninguna) | +| | +| | + \**************************************************************************/ +BDatos::~BDatos() +{ + if ( rError == ERROR ) return; + fclose( handle_BDatos ); +} + + + /**************************************************************************\ +| | +| Registros | +| | +| Descripcion: | +| Obtiene el n£mero de registros total de la base de datos. | +| | +| | +| Entradas: (ninguna) | +| | +| Salidas: numero de registros | +| | + \**************************************************************************/ +long BDatos::Registros(void) +{ + return BDatosHeader.NRegistros; +} + + /**************************************************************************\ +| | +| NRegTotal | +| | +| Descripcion: | +| Obtiene el n£mero de registros total, total del la base. | +| | +| | +| Entradas: (ninguna) | +| | +| Salidas: numero de registros | +| | + \**************************************************************************/ +long BDatos::NRegTotal(void) +{ + return BDatosHeader.NRegTotal; +} + + /**************************************************************************\ +| | +| RegActual | +| | +| Descripcion: | +| Obtiene el n£mero de registro actual. | +| | +| | +| Entradas: (ninguna) | +| | +| Salidas: numero de registro en tratamiento | +| | + \**************************************************************************/ +long BDatos::RegActual(void) +{ + return NRegActual; +} + + /**************************************************************************\ +| | +| AbrirReg | +| | +| Descripcion: | +| Abre los ficheros indices y datos. | +| | +| | +| Entradas: nombre fichero "sin comodines" | +| longitud de un registro "en bytes" | +| | +| Salidas: OK ( todo va bien ) | +| ERROR ( error ) | +| | +| | + \**************************************************************************/ +int BDatos::AbrirReg(char *file, long sizereg) +{ +// char bdatos[ARCH_LEN]; + char *bdatos; + + bdatos = file; + + BDatosHeader.MyHeader = MyHeader; + + Header NewHeader = BDatosHeader; + + rError = OK; + + strncpy( bdatos, file, ARCH_LEN ); + + if ( (handle_BDatos = fopen( bdatos, "r+b" ) ) == NULL ) + { + // Inicializamos una nueva base de datos + if ( (handle_BDatos = fopen( bdatos, "w" ) ) == NULL ) + { + lError = 0x01; ObtenError( lError ); + return (rError = ERROR); + } + + rewind( handle_BDatos ); + BDatosHeader.SizeReg = sizereg; + fwrite( &BDatosHeader, sizeof( BDatosHeader ), 1, handle_BDatos ); + + fclose( handle_BDatos ); + + if ( (handle_BDatos = fopen( bdatos, "r+b" ) ) == NULL ) + { + lError = 0x01; ObtenError( lError ); + return (rError = ERROR); + } + } else { + + rewind( handle_BDatos ); + fread( &BDatosHeader, sizeof(BDatosHeader), 1, handle_BDatos); + + if ( BDatosHeader.SizeReg != sizereg || BDatosHeader.VerHi != NewHeader.VerHi ) + { + lError = 0x03; ObtenError( lError ); + fclose( handle_BDatos ); + return (rError = ERROR); + } + } + + return OK; +} + + /**************************************************************************\ +| | +| CerrarReg | +| | +| Descripcion: | +| Cierra la base de datos. | +| | +| | +| Entradas: (ninguno) | +| | +| Salidas: OK ( todo va bien ) | +| ERROR ( error ) | +| | + \**************************************************************************/ +void BDatos::CerrarReg( void ) +{ + if ( rError == ERROR ) return; + fclose( handle_BDatos ); + rError = ERROR; +} + + /**************************************************************************\ +| | +| LeeReg | +| | +| Descripcion: | +| Lee el registro de la posici¢n 'pos' y lo almacena en 'dato' | +| | +| | +| Entradas: puntero a los datos | +| posicion a leer | +| | +| Salidas: OK ( todo va bien ) | +| ERROR ( error ) | +| | + \**************************************************************************/ +int BDatos::LeeReg( void *dato, long pos ) +{ + BTree inx; + + if ( rError == ERROR ) + { + lError = 0x05; ObtenError( lError ); + return ERROR; + } + + if ( pos > BDatosHeader.NRegistros || pos < 0 ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + NRegActual = pos; + fseek( handle_BDatos, (long)( pos * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &inx, sizeof( BTree ), 1, handle_BDatos ); + + if ( inx.pos < 0 || inx.code != ' ' ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + fseek( handle_BDatos, (long)( inx.pos * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) + sizeof( BTree ) ), SEEK_SET ); + fread ( dato, BDatosHeader.SizeReg, 1, handle_BDatos ); + + return OK; +} + + /**************************************************************************\ +| | +| EscribeReg | +| | +| Descripcion: | +| Escribe el registro en la posici¢n 'pos' de 'dato' | +| | +| | +| Entradas: puntero a los datos | +| posicion a escribir | +| | +| Salidas: OK ( todo va bien ) | +| ERROR ( error ) | +| | + \**************************************************************************/ +int BDatos::EscribeReg( void *dato, long pos ) +{ + BTree inx; + + if ( rError == ERROR ) + { + lError = 0x05; ObtenError( lError ); + return ERROR; + } + + if ( pos > BDatosHeader.NRegistros || pos < 0 ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + NRegActual = pos; + fseek( handle_BDatos, (long)( pos * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &inx, sizeof( BTree ), 1, handle_BDatos ); + + if ( inx.pos < 0 || inx.code != ' ' ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + fseek( handle_BDatos, (long)( inx.pos * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) + sizeof( BTree ) ), SEEK_SET ); + fwrite( dato, BDatosHeader.SizeReg, 1, handle_BDatos ); + + return OK; +} + + /**************************************************************************\ +| | +| InsReg | +| | +| Descripcion: | +| Inserta un registro, en la posici¢n 'pos' por arriba o abajo | +| | +| | +| Entradas: puntero a los datos a insertar, posici¢n, ARRIBA o ABAJO | +| | +| Salidas: (ninguna) | +| | + \**************************************************************************/ +int BDatos::InsReg( void *dato, long pos, char ab ) +{ + BTree inx, old_inx; + unsigned long avance; + long RegTot; + + if ( rError == ERROR ) + { + lError = 0x05; ObtenError( lError ); + return ERROR; + } + + // Filtro los datos conflictivos + if ( pos == 0 && BDatosHeader.NRegistros == 1 && ab == ARRIBA ) + { + pos = 1; + } else + if ( pos == (BDatosHeader.NRegistros - 1) && ab == ARRIBA ) + { + pos = BDatosHeader.NRegistros; + } + + BDatosHeader.NRegistros++; + if ( pos > (BDatosHeader.NRegistros-1) || pos < 0 ) +// if ( pos >= (BDatosHeader.NRegistros-1) && BDatosHeader.NRegistros!=1 ) + { + BDatosHeader.NRegistros--; + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + // Si hay fichas eliminadas, utilizamos sus direcciones intermedias. + if ( (BDatosHeader.NRegTotal - ( BDatosHeader.NRegistros - 1 ) ) > 0 ) + { + fseek( handle_BDatos, (long)( ( BDatosHeader.NRegistros - 1 ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &old_inx, sizeof( BTree ), 1, handle_BDatos ); + } else { + old_inx.pos = ( BDatosHeader.NRegistros - 1 ); + BDatosHeader.NRegTotal++; + } + +// |<---------- RegTot ----------->| +// |<----- NRegistros ---->| | +// ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ +// ³ 1 ³ 2 ³ 5 ³ 6 ³ 4 ³ 3 ³ * ³ * ³ ³ ³ ³ ³ ³ +// ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ +// +// 2 up Âpos+1 +// ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ +// ³ 1 ³ 2 ³ * ³ 5 ³ 6 ³ 4 ³ 3 ³ * ³ ³ ³ ³ ³ ³ +// ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ +// 2 down Âpos +// ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ +// ³ 1 ³ * ³ 2 ³ 5 ³ 6 ³ 4 ³ 3 ³ * ³ ³ ³ ³ ³ ³ +// ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ + + avance = ( BDatosHeader.NRegistros - 1 ); + while ( avance > ( pos + ab ) ) + { + fseek( handle_BDatos, (long)( ( avance - 1 ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &inx, sizeof( BTree ), 1, handle_BDatos ); + + fseek( handle_BDatos, (long)( ( avance ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fwrite( &inx, sizeof( BTree ), 1, handle_BDatos ); + + avance--; + }; + + if ( ( BDatosHeader.NRegistros - 1 ) == 0 ) + fseek( handle_BDatos, sizeof( Header ), SEEK_SET); + else { + ab = ( ( BDatosHeader.NRegistros - 1 ) <= ( pos + ab ) ) ? 0 : ab; + fseek( handle_BDatos, (long)( ( pos + ab ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + } + + NRegActual = ( BDatosHeader.NRegistros - 1 ) == 0 ? 0 : pos + ab; + old_inx.code = ' '; + fwrite( &old_inx, sizeof( BTree ), 1, handle_BDatos ); + + fseek( handle_BDatos, (long)( ( old_inx.pos ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) + sizeof( BTree ) ), SEEK_SET ); + fwrite( dato, BDatosHeader.SizeReg, 1, handle_BDatos ); + + rewind( handle_BDatos ); + fwrite( &BDatosHeader, sizeof( Header ), 1, handle_BDatos ); + + return OK; + +} + + + + /**************************************************************************\ +| | +| DelReg | +| | +| Descripcion: | +| Borra un registro, de la posici¢n 'pos' | +| | +| | +| Entradas: posici¢n a borrar | +| | +| Salidas: (ninguna) | +| | + \**************************************************************************/ +int BDatos::DelReg( long pos ) +{ + BTree inx, old_inx; + + if ( rError == ERROR ) + { + lError = 0x05; ObtenError( lError ); + return ERROR; + } + + BDatosHeader.NRegistros--; + if ( pos > BDatosHeader.NRegistros || pos < 0) + { + BDatosHeader.NRegistros++; + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + fseek( handle_BDatos, (long)( ( pos ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &old_inx, sizeof( BTree ), 1, handle_BDatos ); + +// |<---------- RegTot ----------->| +// |<----- NRegistros ---->| | +// ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ +// ³ 1 ³ 2 ³ 5 ³ 6 ³ 4 ³ 3 ³ * ³ * ³ ³ ³ ³ ³ ³ +// ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ +// + + unsigned long avance; + + avance = pos; + while ( avance < BDatosHeader.NRegistros ) + { + fseek ( handle_BDatos, (long)( ( avance + 1 ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread ( &inx, sizeof( BTree ), 1, handle_BDatos ); + + fseek ( handle_BDatos, (long)( ( avance ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fwrite( &inx, sizeof( BTree ), 1, handle_BDatos ); + + avance++; + }; + + NRegActual = BDatosHeader.NRegistros == 1 ? 0 : ( BDatosHeader.NRegistros - 1); + fseek( handle_BDatos, (long)( ( BDatosHeader.NRegistros ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + + old_inx.code = '*'; + fwrite( &old_inx, sizeof( BTree ), 1, handle_BDatos ); + + rewind( handle_BDatos ); + fwrite( &BDatosHeader, sizeof( Header ), 1, handle_BDatos ); + + return OK; +} + + /**************************************************************************\ +| | +| ShortReg | +| | +| Descripcion: | +| Corta el fichero y lo hace mas peque¤o. | +| | +| | +| Entradas: (ninguna) | +| | +| Salidas: (ninguna) | +| | + \**************************************************************************/ +int BDatos::ShortReg(void) +{ + long avance, recorrido; + BTree inx, curr_inx; + void *SWAPdatos; + char enc; + + if ( ( BDatosHeader.NRegTotal - BDatosHeader.NRegistros ) <= 0 ) return OK; + + if ( ( SWAPdatos = calloc( 1, BDatosHeader.SizeReg ) ) == NULL ) + { + lError = 0x07; ObtenError( lError ); + return ERROR; + } + + avance = BDatosHeader.NRegTotal-1; + while( avance >= BDatosHeader.NRegistros ) + { + // Obtengo la direcci¢n del campo que est  libre y el dato. + fseek( handle_BDatos, (long)( ( avance ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &inx, sizeof( BTree ), 1, handle_BDatos ); + fread( SWAPdatos, BDatosHeader.SizeReg, 1, handle_BDatos ); + + // Busco la direcci¢n del indice para la ficha actual. + recorrido = avance; enc = FALSO; + while( recorrido >= 0 && !enc ) + { + fseek( handle_BDatos, (long)( ( recorrido ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &curr_inx, sizeof( BTree ), 1, handle_BDatos ); + if ( curr_inx.pos == avance ) + enc = CIERTO; + else + recorrido--; + } + + // Si alguien de fuera referencia a esa ficha... + if ( enc ) + { + curr_inx.pos = inx.pos; + //Actualizo el indice para comunicarle la nueva posici¢n. + fseek( handle_BDatos, (long)( ( recorrido ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fwrite( &curr_inx, sizeof( BTree ), 1, handle_BDatos ); + // Pongo la ficha actual en la direcci¢n libre. + fseek ( handle_BDatos, (long)( ( curr_inx.pos ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) + sizeof( BTree ) ), SEEK_SET ); + fwrite( SWAPdatos, BDatosHeader.SizeReg, 1, handle_BDatos ); + } + + avance--; + + }; + + // Actualizo la base de registros + NRegActual = BDatosHeader.NRegistros - 1; + BDatosHeader.NRegTotal = BDatosHeader.NRegistros; + rewind( handle_BDatos ); + fwrite( &BDatosHeader, sizeof( Header ), 1, handle_BDatos ); + + // Corto todo lo que sobra de fichero + if ( chsize( fileno(handle_BDatos), (long)(sizeof( Header ) + ( BDatosHeader.NRegistros * ( sizeof( BTree ) + BDatosHeader.SizeReg ) )) ) == -1 ) + { + lError = 0x08; ObtenError( lError ); + return OK; // Este error no es del todo grave, pero se avisa. + } + + free( SWAPdatos ); + return OK; +} + + + /**************************************************************************\ +| | +| ObtenError | +| | +| Descripcion: | +| Obtiene el error correspondiente al codigo dado. | +| | +| | +| Entradas: codigo de error | +| | +| Salidas: (ninguna) | +| | + \**************************************************************************/ +void BDatos::ObtenError( int code ) +{ + + switch( code ) + { + case 0x00: + strcpy( cError, "No hay errores" ); + break; + case 0x01: + strcpy( cError, "Imposible inicializar base de datos" ); + break; + case 0x02: + strcpy( cError, "No se puede abrir el fichero" ); + break; + case 0x03: + strcpy( cError, "Version de fich. incompatible" ); + break; + case 0x04: + strcpy( cError, "No se pudo acceder a esa posici¢n." ); + break; + case 0x05: + strcpy( cError, "No hay base de datos en uso..." ); + break; + case 0x06: + strcpy( cError, "Tama¤os de estructuras no coinciden" ); + break; + case 0x07: + strcpy( cError, "Memoria insuficiente. Operaci¢n cancelada" ); + break; + case 0x08: + strcpy( cError, "Acceso de operacion no permitida." ); + break; + } + +} + + + /**************************************************************************\ +| | +| SortReg | +| | +| Descripcion: | +| Ordena la base de datos seg£n especifique el usuario en su | +| funci¢n fcmp... | +| | +| Entradas: /**************************************************************\ | +| | fcmp || +| | || +| | Descripcion: || +| | funci¢n de entrada a SortReg, debe ser realizada || +| | por el usuario y debe ce¤irse a sus par metros.. || +| | || +| | Entradas: ptrs. a dos estructuras de usuario. ( ejm. A, B ) || +| | Salidas: >> 0 si A >> B || +| | == 0 si A == B || +| | << 0 si A << B || +| \************************************************************** | +| | +| | +| | +| | +| Salidas: ERROR se cargan los registros con el codigo de error esp. | +| OK todo ha ido bien | +| | + \**************************************************************************/ +int BDatos::SortReg( int (*fcmp)(const void *, const void *) ) +{ + char dev; + + // Pido memoria para mantener dos elementos auxiliares + if ( + ( A = calloc( 1, BDatosHeader.SizeReg ) ) == NULL || + ( B = calloc( 1, BDatosHeader.SizeReg ) ) == NULL + ) + { + lError = 0x07; ObtenError( lError ); + return ERROR; + } + + dev = SortRegi( fcmp, 0, BDatosHeader.NRegistros-1 ); + + free(A); free(B); + + return dev; +} + +int BDatos::SortRegi( int (*fcmp)(const void *, const void *), long izquierda, long derecha ) +{ + BTree inx1, inx2; + register long i, j; + + i = izquierda; j = derecha; + if ( LeeReg( A, (long)(izquierda+derecha)/2 + 1 ) != OK ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + do { + if ( LeeReg( B, i )!= OK ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + while( i < derecha && fcmp( B, A ) < 0 ) + { + i++; + if ( LeeReg( B, i ) != OK ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + }; + + LeeReg( B, j ); + while( j > izquierda && fcmp( A, B ) < 0 ) + { + j--; + if ( LeeReg( B, j ) != OK ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + }; + + if ( i <= j ) + { + // Intercambiamos solo los indices sin chequear si son + // accesibles, ( si no lo fueran, se abria abortado ) + fseek( handle_BDatos, (long)( i * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &inx1, sizeof( BTree ), 1, handle_BDatos ); + fseek( handle_BDatos, (long)( j * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &inx2, sizeof( BTree ), 1, handle_BDatos ); + + fseek( handle_BDatos, (long)( j * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fwrite( &inx1, sizeof( BTree ), 1, handle_BDatos ); + fseek( handle_BDatos, (long)( i * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fwrite( &inx2, sizeof( BTree ), 1, handle_BDatos ); + + i++; j--; + } + + } while( i <= j ); + + if ( izquierda < j ) SortRegi( fcmp, izquierda, j ); + if ( i < derecha ) SortRegi( fcmp, i, derecha ); + + return OK; +} + diff --git a/BDATOS.EXE b/BDATOS.EXE new file mode 100644 index 0000000000000000000000000000000000000000..4763e661acfaa4e6538aa1aa6303493b7ff0e11a GIT binary patch literal 34586 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 + +#define OK 0 +#define ERROR 1 +#define NO_ENC -1 + +#define ARRIBA 1 +#define ABAJO 0 + +#if !defined(__BDatos_CPP) + #ifdef __cplusplus + extern "C" { + #endif +#endif + + typedef struct + { + char ProgName[15]; // Estos datos se comprueban al abrir la base + char VerHi, VerLow; // para saber si es la adecuada para su progr. + + char Other[200]; + } YourHeader; + + typedef struct + { + char NBD[13]; + char Eof_Code; + char VerHi, VerLow; + YourHeader MyHeader; + long NRegistros; + long NRegTotal; + long SizeReg; + } Header; + + class BDatos { + + public: + + char lError; + char cError[80]; + YourHeader MyHeader; + + void ObtenError(int code); // Obtiene el error "code" + long Registros(void); // N§ de registros + long NRegTotal(void); // N§ de registros + long RegActual(void); // Reg. Actual + + BDatos(); // Constructor de Clase + ~BDatos(); // Destructor de Clase + int AbrirReg( char *file, long sizereg ); // Abre el Fichero + void CerrarReg( void ); // Cierra el Fich. + int EscribeReg( void *dato, long pos ); // Escribe un Dato + int LeeReg( void *dato, long pos ); // Lee un Dato + int InsReg( void *dato, long pos, char ab ); // Inserta un Reg en pos. + int DelReg( long pos ); // Borra un Reg de pos. + + int ShortReg(void); // Corta el fich. y lo hace mas peque¤o + + // Ordena la Base + int SortReg( int (*fcmp)(const void *, const void *) ); + // Busca un registro en una base ordenada + int BuscReg( long PosIni, int (*fcmp)(const void *, const void *) ); + + private: + // Funcion auxiliar de ordenaci¢n + int SortRegInt( long k, long n, int (*fcmp)(const void *, const void *)); + + FILE *handle_BDatos; // Handle a la Base + Header BDatosHeader; + long NRegActual; + char filename[80]; + char rError; + }; + + +#if !defined(__BDatos_CPP) + #ifdef __cplusplus + } + #endif +#endif + +#endif + + + +/* + 1 2 3 4 5 6 7 8 9 0 + ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ + ³ 2 ³ 3 ³ 6 ³ 9 ³ 1 ³ 4 ³ 5 ³ ³ ³ ³ ³ ³ ³ + ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ + +INS (2_3) + (si existen archivos borrados: " (TotalRecords+1) mark * " coge su posicion ) + + 1 2 3 4 5 6 7 8 9 0 + ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ + ³ 2 ³ 3 ³ 6 ³ 9 ³ 1 ³ 4 ³ 5 ³*X1³*X2³ ³ ³ ³ ³ + ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ + ÀÄÄ^ÀÄÄ^ÀÄÄ^ÀÄÄ^ÀÄÄ^ ³ + ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ + ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ + ³ 2 ³ 3 ³ X2³ 6 ³ 9 ³ 1 ³ 4 ³ 5 ³*X2³ ³ ³ ³ ³ + ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ + + (si no existen archivos borrados: coge la posicion de Records + 1 ) + + 1 2 3 4 5 6 7 8 9 0 + ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ + ³ 2 ³ 3 ³ 6 ³ 7 ³ 1 ³ 4 ³ 5 ³ ³ ³ ³ ³ ³ ³ + ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ + ÀÄÄ^ÀÄÄ^ÀÄÄ^ÀÄÄ^ÀÄÄ^ + ÀÄrecords = 7ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ + ÄÂÄ + ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ + ³ 2 ³ 3 ³7+1³ 6 ³ 7 ³ 1 ³ 4 ³ 5 ³ ³ ³ ³ ³ ³ + ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ + ÄÁÄ +DEL (3) + 1 2 3 4 5 6 7 8 9 0 + ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ + ³ 2 ³ 3 ³ X ³ 6 ³ 9 ³ 1 ³ 4 ³ 5 ³ ³ ³ ³ ³ ³ + ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ + ³^ÄÄÙ^ÄÄÙ^ÄÄÙ^ÄÄÙ /.\ + ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ + ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ + ³ 2 ³ 3 ³ 6 ³ 9 ³ 1 ³ 4 ³ 5 ³*X ³ ³ ³ ³ ³ ³ + ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ + Á Reg Mark * +*/ + + diff --git a/BDATOS.PRJ b/BDATOS.PRJ new file mode 100644 index 0000000000000000000000000000000000000000..0e5d2106bd9bf7cfa0129a095fba8fa0e2b7f787 GIT binary patch literal 5456 zcmeI0Yj6`)6vxj^(>85^K2T|SxoWIXhL*O_LQ&K0CM|K2Y$ltIAVG$A(-z;Q zim0RG`->la;{z3ZjpGP@mY0so(@*+I9Y6R2U&wm?cRSc|n(np+869^gznpvT|D1F8 z?0e%w>5i15DbaN5`ef&z(%Q2rsmvxZy=<1?zx+Cic|IT)3EImf+9&P(k_TkZL218N zgwfrSdzgaWm;6|cej@oPGlvc{o9T$`IVyRKNjb+s`i?#6d*BD)M}{~7>m<2}Mu>hw z<7eO(;8%DlJKapzw=%-vBJMr{9F?;<2J<+ZCG;87O~1kK&0@wWw#4sfo(4>S1o!bm zB8Ne4AQ#9(Up}M4!{{ntD1{6v0;U1e8Da)djAjW?3Ovc#Tu&k8)4(&pv%qt}^T2lC z1z;zz3wRxP19%a5iIMX%tR28Bz^lM(z+1rEKp9fb1kPiK^I=^8%o0`&%h9M1sP}A` zbAY)FF%Ou}$hi=f!k~+RO8_r$DNxDI=9bIYS|r2V;9_$vL#zX?1v-FEpbJO>8-Z@% zItKLueLxC*H^LeKhJelJy9w6Kuxm6s41c8;b<_VCR+4ZNR9Zlgx((K z$~s@F#R&PE649967E{B2#tBBWP`f{{a=bAuq#8yj*pe6(InOq}vL?eEIK{;ISulRY z$@ebd!?V7Qs8-}s-7@yCW21J-5~6ysW%A*&>#Y4APs7FTQ0D7DF3g=zBnOnH2-{n~v}DWpRl8g7dPq7HUYcRJbcK;~GoxNni- z4F|#t8kR0pyb;~FT8%1Rz7B_@amA}~BW$!Sz~t)KShzXW)1_2ZcPfq({6oThrWlUP z2RU_MAlcioDVffcIj$PvOk-2&uL-YKYOVcI>IlXR1E?O|mLD>`!(Kb$4g3 zAPsg+HOcsX-oWZWL=6YVAN}|A9yn7%ewoxp5tgA^0hG7+n-7gDxsc^^oDfLhQ18W!EiK-Pp@3U zYzNFR@3Yqf%r z8vTANi4}PwzBeav9e;2Vq|bB&CRV;2q?-=*VEHuU|?hzZonPrAplkS2xR~O literal 0 HcmV?d00001 diff --git a/PDATOS.CPP b/PDATOS.CPP new file mode 100644 index 0000000..a72eba7 --- /dev/null +++ b/PDATOS.CPP @@ -0,0 +1,190 @@ +#include +int InsReg( long pos, char ab ); + +long NRegistros = 9; + +char BTree_code[100] = { '*', 32, 32, 32, 32, 32, 32, 32, 32, '*', '*', '*'}; +long BTree_pos [100] = { 10, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 11 }; +long NRegTot = 12; + +#define ARRIBA 1 +#define ABAJO 0 +#define OK 0 +#define ERROR 1 +#define NO_ENC -1 + +int DelReg( long pos ); + +void main(void) +{ + int pos, ab; + pos = 0; + printf("\n"); + while ( pos < NRegTot ) + { printf( " %c%d ", BTree_code[pos], BTree_pos[pos] ); pos++; } + + printf("\nIntroduzca posici¢n, y metodo ( ARRIBA=1, ABAJO=0 ) --->"); + scanf( "%d %d", &pos, &ab ); + if ( ab < 0 || ab > 1 ) return; + +// InsReg( pos, ab ); + DelReg( pos ); + pos = 0; + printf("\n"); + while ( pos < NRegTot ) + { printf( " %c%d ", BTree_code[pos], BTree_pos[pos] ); pos++; } + + + +} + +int InsReg( long pos, char ab ) +{ + NRegistros++; + if ( pos >= (NRegistros-1) && NRegistros != 1) + { + NRegistros--; +// ObtenError( 0x04 ); + printf( "\nError registro no valido" ); + return ERROR; + } + +// char RegTot; + long dir_libre; + char codigo; + +/* + fseek( handle_BTree, 0L, SEEK_END ); + RegTot = ( ftell( handle_BTree ) - HeaderLen ) / ( sizeof(long) + sizeof(char) ); +*/ + + // Si hay fichas eliminadas, utilizamos sus direcciones intermedias. + if ( (NRegTot - ( NRegistros - 1 ) ) > 0 ) + { + dir_libre = BTree_pos[NRegistros-1]; + codigo = BTree_code[NRegistros-1]; +/* + fseek( handle_BTree, ( ( sizeof(long) + sizeof(char) ) * ( NRegistros ) ) + Header_Len ), SEEK_SET ); + fread( &dir_libre, sizeof(long), 1, handle_BTree ); + fread( &codigo, sizeof(char), 1, handle_BTree ); +*/ + // si la supuesta ficha eliminada, no lo esta, utilizamos la siguiente + if ( codigo != '*' ) + dir_libre = NRegistros; + } else + dir_libre = ( NRegistros - 1 ); + +// |<---------- RegTot ----------->| +// |<----- NRegistros ---->| | +// ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ +// ³ 1 ³ 2 ³ 5 ³ 6 ³ 4 ³ 3 ³ * ³ * ³ ³ ³ ³ ³ ³ +// ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ +// +// 2 up Âpos+1 +// ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ +// ³ 1 ³ 2 ³ * ³ 5 ³ 6 ³ 4 ³ 3 ³ * ³ ³ ³ ³ ³ ³ +// ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ +// 2 down Âpos +// ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ +// ³ 1 ³ * ³ 2 ³ 5 ³ 6 ³ 4 ³ 3 ³ * ³ ³ ³ ³ ³ ³ +// ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ + + unsigned long avance; + avance = ( NRegistros - 1 ); + while ( avance > ( pos + ab ) ) + { +/* + fseek( handle_BTree, ((sizeof(long)+sizeof(char))*(avance-1))+HeaderLen, SEEK_SET); + fread( &dirch , sizeof(long), 1, handle_BTree ); + fread( &codch , sizeof(char), 1, handle_BTree ); + + fwrite( &dirch , sizeof(long), 1, handle_BTree ); + fwrite( &codch , sizeof(char), 1, handle_BTree ); +*/ + BTree_code[avance] = BTree_code[avance-1]; + BTree_pos [avance] = BTree_pos [avance-1]; + avance--; + } + if ( ( NRegistros - 1 ) == 0 ) + //fseek( handle_BTree, HeaderLen, SEEK_SET); + {BTree_code[0] = ' '; BTree_pos[0] = dir_libre;} + else + //fseek( handle_BTree, ((sizeof(long)+sizeof(char))*(pos + ab))+HeaderLen, SEEK_SET); + {BTree_code[pos+ab] = ' '; BTree_pos[pos+ab] = dir_libre;} +/* + codch = ' '; + fwrite( &dir_libre, sizeof(long), 1, handle_BTree ); + fwrite( &codch , sizeof(char), 1, handle_BTree ); +*/ +/* + fseek( handle_BDatos, ( ( SizeReg*dir_libre ) + HeaderLen ), SEEK_SET ); + fwrite( datos, SizeReg, 1, handle_BDatos ); + + fseek( handle_BTree, 14L, SEEK_SET ); + fwrite( &NRegistro, sizeof(long), 1, handle_BTree ); +*/ + + +} + +int DelReg( long pos ) +{ + long old_dir; + char new_cod; +/* + NRegistros++; + if ( pos >= (NRegistros-1) && NRegistros != 1) +*/ + NRegistros--; + if ( pos >= (NRegistros+1) ) + { + NRegistros++; + printf( "\nError registro no valido\n" ); + return ERROR; + } + +/* + fseek( handle_BTree, ( ( sizeof(long) + sizeof(char) ) * pos ) + Header_Len ), SEEK_SET ); + fread( &old_dir, sizeof(long), 1, handle_BTree ); +*/ + old_dir = BTree_pos[pos]; + +// |<---------- RegTot ----------->| +// |<----- NRegistros ---->| | +// ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿ +// ³ 1 ³ 2 ³ 5 ³ 6 ³ 4 ³ 3 ³ * ³ * ³ ³ ³ ³ ³ ³ +// ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ +// + + unsigned long avance; + + avance = pos; + while ( avance < (NRegistros /*+ 1*/) ) + { +/* + fseek( handle_BTree, ((sizeof(long)+sizeof(char))*(avance+1))+HeaderLen, SEEK_SET); + fread( &dirch , sizeof(long), 1, handle_BTree ); + fread( &codch , sizeof(char), 1, handle_BTree ); + fseek( handle_BTree, ((sizeof(long)+sizeof(char))*( avance ))+HeaderLen, SEEK_SET); + fwrite( &dirch , sizeof(long), 1, handle_BTree ); + fwrite( &codch , sizeof(char), 1, handle_BTree ); +*/ + BTree_code[avance] = BTree_code[avance+1]; + BTree_pos [avance] = BTree_pos [avance+1]; + avance++; + } +/* + fseek( handle_BTree, ((sizeof(long)+sizeof(char))*(NRegistros+1))+HeaderLen, SEEK_SET); + + new_cod = '*'; + fwrite( &old_dir, sizeof(long), 1, handle_BTree ); + fwrite( &new_cod, sizeof(char), 1, handle_BTree ); +*/ + BTree_code[avance] = '*'; + BTree_pos [avance] = old_dir; + +/* + fseek ( handle_BTree, (sizeof(char)*14), SEEK_SET ); + fwrite( &NRegistros, sizeof(long), 1, handle_BTree ); +*/ +} diff --git a/PDATOS.EXE b/PDATOS.EXE new file mode 100644 index 0000000000000000000000000000000000000000..d9b9d50a70f052fea29969379667e90c73154a26 GIT binary patch literal 13940 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 +#include +#include +#include + +#include "BDatos.hh" + +void Altas(void); +void Bajas(void); +void Listar(void); +void Modificar(void); +void MuestraMenu(void); +int Busca( char *nombre ); +void Insertar_Especial(void); + +void RellenaBase(void); +int fcmp( const void *A, const void *B ); + + +typedef struct +{ + char nombre[15]; + char apellidos[50]; + long DNI; + int Grupo; +} DummyStruct; + +DummyStruct dummy; + +BDatos DummyBase; + +int main(void) +{ + int ok = 0; + + strcpy( DummyBase.MyHeader.ProgName, "Dummy Prog..." ); + DummyBase.MyHeader.VerHi = 1; + DummyBase.MyHeader.VerLow = 0; + if ( DummyBase.AbrirReg( "dummy.fil", sizeof( DummyStruct ) ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + DummyBase.CerrarReg(); + return 1; + } + + do + { + MuestraMenu(); + switch( getch() ) + { + // Altas + case '1': + Altas(); + break; + // Bajas + case '2': + Bajas(); + break; + // Modificaciones + case '3': + Modificar(); + break; + // Listar + case '4': + Listar(); + break; + // CortarRegistros + case '5': + DummyBase.ShortReg(); + break; + // Altas + case '6': + Insertar_Especial(); + break; + // Ordena la base segun nombre + case '7': + DummyBase.SortReg( fcmp ); + break; + case '8': + RellenaBase(); + break; + + // Fin + case '0': + ok = 1; + break; + + }; + }while( !ok ); + + DummyBase.CerrarReg(); + + return 0; +} + +void MuestraMenu(void) +{ + clrscr(); + cprintf(" M E N é P R I N C I P A L \r\n"); + cprintf("-------------------------------\r\n"); + + cprintf(" 1 Altas ³ nReg: %ld \r\n", DummyBase.Registros() ); + cprintf(" 2 Bajas ³ nRegT: %ld \r\n", DummyBase.NRegTotal() ); + cprintf(" 3 Modificaciones ³ CReg: %ld \r\n", DummyBase.RegActual() ); + cprintf(" 4 Listar ³ --- \r\n"); + cprintf(" 5 Cortar Fichero ³ _-ù J.D ù-_\r\n"); + cprintf(" ³ ù-_ F.V _-ù\r\n"); + cprintf(" 0 Salir al DOS ³ --- \r\n"); + cprintf(" ³ F R i \r\n"); + cprintf(" 6 Ins. Especial ³ u e S \r\n"); + cprintf(" 7 Ordenar Campo ³ T N i \r\n"); + cprintf(" ³ u O V \r\n"); +} + +void RellenaBase(void) +{ + int ficha; + + cprintf("\r\nRellenando base con 800 fichas. Por favor, espere..."); + + for( ficha=0; ficha<800; ficha++ ) + { + sprintf( dummy.nombre, "P%03d", (800-ficha) ); + sprintf( dummy.apellidos, "P%03d", ficha ); + dummy.DNI = ficha; + dummy.Grupo = ficha; + + // Inserta un Reg por arriba de pos. + if ( DummyBase.InsReg( (void *)&dummy, ficha, ARRIBA ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + DummyBase.CerrarReg(); + exit(1); + } + } +} + +void Altas(void) +{ + cprintf("\r\nIntroduzca: ( nombre, apellidos, DNI, Grupo ) \r\n"); + scanf( "%14s %49s %ld %d", dummy.nombre, dummy.apellidos, &dummy.DNI, &dummy.Grupo ); + + // Inserta un Reg por arriba de pos. + if ( DummyBase.InsReg( (void *)&dummy, DummyBase.Registros(), ARRIBA ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + DummyBase.CerrarReg(); + exit(1); + } +} + +void Insertar_Especial(void) +{ + int PorDonde, Adonde; + + cprintf("\r\nIntroduzca: ( nombre, apellidos, DNI, Grupo ) \r\n"); + scanf( "%14s %49s %ld %d", dummy.nombre, dummy.apellidos, &dummy.DNI, &dummy.Grupo ); + fflush(stdin); + + cprintf("\r\nIntroduzca donde y por donde insertar (1==ARRIBA)(0==ABAJO): "); + scanf( "%d %d", &Adonde, &PorDonde ); + fflush(stdin); + + PorDonde = ( PorDonde == 1 ) ? ARRIBA : ABAJO ; + + // Inserta un Reg por arriba de pos. + if ( DummyBase.InsReg( (void *)&dummy, Adonde, PorDonde ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + + cprintf("\r\nRegistros aun abiertos, condici¢n metaestable"); + } +} + +void Bajas(void) +{ + char nombTMP[80]; + cprintf("\r\nIntroduzca nombre a eliminar: "); + scanf( "%14s", nombTMP ); + + if ( Busca( nombTMP ) != OK ) + { + cprintf( "\r\nFichero no se encuentra en la base" ); + getch(); + return; + } + + if ( DummyBase.LeeReg( (void *)&dummy, DummyBase.RegActual() ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + DummyBase.CerrarReg(); + exit(1); + } + + cprintf( "%14s %40s %5ld %5d\n\r", dummy.nombre, dummy.apellidos, dummy.DNI, dummy.Grupo ); + + if ( getch() == 32 ) return; + + // Borra el registro de la posicion actual + if ( DummyBase.DelReg( DummyBase.RegActual() ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + DummyBase.CerrarReg(); + exit(1); + } +} + +void Modificar(void) +{ + char nombTMP[80]; + + cprintf("\r\nIntroduzca nombre a modificar: "); + scanf( "%14s", nombTMP ); + + if ( Busca( nombTMP ) != OK ) + { + cprintf( "\r\nFichero no se encuentra en la base" ); + getch(); + return; + } + + + cprintf("\r\nIntroduzca: ( nombre, apellidos, DNI, Grupo ) \r\n"); + scanf( "%14s %49s %ld %d", dummy.nombre, dummy.apellidos, &dummy.DNI, &dummy.Grupo ); + + // Escribe el Reg en la base + if ( DummyBase.EscribeReg( (void *)&dummy, DummyBase.RegActual() ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + DummyBase.CerrarReg(); + exit(1); + } + +} + +void Listar( void ) +{ + int i; + cprintf( " Nombre Apelidos D.N.I Grupo \n\r" ); + cprintf( "------------------------------------------------------------------------------\n\r" ); + + + for( i=0; i nombre, ((DummyStruct *)B) -> nombre ); +} +