First commit 31/01/1996
This commit is contained in:
		
							
								
								
									
										734
									
								
								BDATOS.CPP
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										734
									
								
								BDATOS.CPP
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,734 @@
 | 
				
			|||||||
 | 
					#include <io.h>
 | 
				
			||||||
 | 
					#include <mem.h>
 | 
				
			||||||
 | 
					#include <alloc.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define __BDatos_CPP
 | 
				
			||||||
 | 
					#include "d:\program\src_dos\libs\bdatos\BDatos.hh"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//                   <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					#define PROG_NAME    "BDatos::JD::"
 | 
				
			||||||
 | 
					//                   <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					#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<63>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<63>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<63>n 'pos' por arriba o abajo  |
 | 
				
			||||||
 | 
					|                                                                            |
 | 
				
			||||||
 | 
					|                                                                            |
 | 
				
			||||||
 | 
					| Entradas:  puntero a los datos a insertar, posici<63>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 ---->|       |
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					// <20> 1 <20> 2 <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// 2 up  <20>pos+1
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					// <20> 1 <20> 2 <20> * <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					// 2 down <20>pos
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					// <20> 1 <20> * <20> 2 <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 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<63>n 'pos'                       |
 | 
				
			||||||
 | 
					|                                                                            |
 | 
				
			||||||
 | 
					|                                                                            |
 | 
				
			||||||
 | 
					| Entradas:  posici<63>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 ---->|       |
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					// <20> 1 <20> 2 <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 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<75>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<63>n del campo que est<73> 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<63>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<63>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<63>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<63>n." );
 | 
				
			||||||
 | 
						    break;
 | 
				
			||||||
 | 
					  case 0x05:
 | 
				
			||||||
 | 
						    strcpy( cError, "No hay base de datos en uso..." );
 | 
				
			||||||
 | 
						    break;
 | 
				
			||||||
 | 
					  case 0x06:
 | 
				
			||||||
 | 
						    strcpy( cError, "Tama<EFBFBD>os de estructuras no coinciden" );
 | 
				
			||||||
 | 
						    break;
 | 
				
			||||||
 | 
					  case 0x07:
 | 
				
			||||||
 | 
						    strcpy( cError, "Memoria insuficiente. Operaci<63>n cancelada" );
 | 
				
			||||||
 | 
						    break;
 | 
				
			||||||
 | 
					  case 0x08:
 | 
				
			||||||
 | 
						    strcpy( cError, "Acceso de operacion no permitida." );
 | 
				
			||||||
 | 
						    break;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 /**************************************************************************\
 | 
				
			||||||
 | 
					|                                                                            |
 | 
				
			||||||
 | 
					| SortReg                                                                    |
 | 
				
			||||||
 | 
					|                                                                            |
 | 
				
			||||||
 | 
					| Descripcion:                                                               |
 | 
				
			||||||
 | 
					|              Ordena la base de datos seg<65>n especifique el usuario en su    |
 | 
				
			||||||
 | 
					|              funci<63>n fcmp...                                               |
 | 
				
			||||||
 | 
					|                                                                            |
 | 
				
			||||||
 | 
					| Entradas: /**************************************************************\ |
 | 
				
			||||||
 | 
					|          | fcmp                                                           ||
 | 
				
			||||||
 | 
					|          |                                                                ||
 | 
				
			||||||
 | 
					|          | Descripcion:                                                   ||
 | 
				
			||||||
 | 
					|          |              funci<63>n de entrada a SortReg, debe ser realizada  ||
 | 
				
			||||||
 | 
					|          |              por el usuario y debe ce<63>irse a sus par<61>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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								BDATOS.EXE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								BDATOS.EXE
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										144
									
								
								BDATOS.HH
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								BDATOS.HH
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,144 @@
 | 
				
			|||||||
 | 
					 /**************************************************************************\
 | 
				
			||||||
 | 
					|                                                                            |
 | 
				
			||||||
 | 
					|  		Clase para el tratamiento de Bases de Datos                  |
 | 
				
			||||||
 | 
					|                                                                            |
 | 
				
			||||||
 | 
					|                      Jos<6F> David Guill<6C>n 1996 (c)                           |
 | 
				
			||||||
 | 
					|                                                                            |
 | 
				
			||||||
 | 
					|                                                                            |
 | 
				
			||||||
 | 
					 \**************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(__BDatos_HH)
 | 
				
			||||||
 | 
					#define __BDatos_HH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#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<75>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<63>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
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					 <20> 2 <20> 3 <20> 6 <20> 9 <20> 1 <20> 4 <20> 5 <20>   <20>   <20>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INS (2_3)
 | 
				
			||||||
 | 
					 (si existen archivos borrados: " (TotalRecords+1) mark * " coge su posicion )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   1   2   3   4   5   6   7   8   9   0
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					 <20> 2 <20> 3 <20> 6 <20> 9 <20> 1 <20> 4 <20> 5 <20>*X1<58>*X2<58>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
						   <20><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^ <20>
 | 
				
			||||||
 | 
						   <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					 <20> 2 <20> 3 <20> X2<58> 6 <20> 9 <20> 1 <20> 4 <20> 5 <20>*X2<58>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 (si no existen archivos borrados: coge la posicion de Records + 1 )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   1   2   3   4   5   6   7   8   9   0
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					 <20> 2 <20> 3 <20> 6 <20> 7 <20> 1 <20> 4 <20> 5 <20>   <20>   <20>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
						   <20><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^
 | 
				
			||||||
 | 
					 <20><>records = 7<><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
						  <20><><EFBFBD>
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					 <20> 2 <20> 3 <20>7+1<> 6 <20> 7 <20> 1 <20> 4 <20> 5 <20>   <20>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
						  <20><><EFBFBD>
 | 
				
			||||||
 | 
					DEL (3)
 | 
				
			||||||
 | 
					   1   2   3   4   5   6   7   8   9   0
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					 <20> 2 <20> 3 <20> X <20> 6 <20> 9 <20> 1 <20> 4 <20> 5 <20>   <20>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
						   <20>^<5E><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>  /.\
 | 
				
			||||||
 | 
						   <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					 <20> 2 <20> 3 <20> 6 <20> 9 <20> 1 <20> 4 <20> 5 <20>*X <20>   <20>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
								     <20> Reg Mark *
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								BDATOS.PRJ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								BDATOS.PRJ
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										190
									
								
								PDATOS.CPP
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								PDATOS.CPP
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,190 @@
 | 
				
			|||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					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<63>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 ---->|       |
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					// <20> 1 <20> 2 <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// 2 up  <20>pos+1
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					// <20> 1 <20> 2 <20> * <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					// 2 down <20>pos
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					// <20> 1 <20> * <20> 2 <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 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 ---->|       |
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
				
			||||||
 | 
					// <20> 1 <20> 2 <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
				
			||||||
 | 
					// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 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 );
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								PDATOS.EXE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								PDATOS.EXE
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										297
									
								
								PRUEBA.CPP
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										297
									
								
								PRUEBA.CPP
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,297 @@
 | 
				
			|||||||
 | 
					 /*************************************************************************\
 | 
				
			||||||
 | 
					|                                                                           |
 | 
				
			||||||
 | 
					| Programa para probar el buen funcionamiento de la libreria BDatos .(JD)   |
 | 
				
			||||||
 | 
					|                                                                           |
 | 
				
			||||||
 | 
					| 12.03.96                                                                  |
 | 
				
			||||||
 | 
					 \*************************************************************************/
 | 
				
			||||||
 | 
					#include <conio.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#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 <20>   P R I N C I P A L  \r\n");
 | 
				
			||||||
 | 
					 cprintf("-------------------------------\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 cprintf(" 1 Altas          <20> nReg:  %ld \r\n", DummyBase.Registros() );
 | 
				
			||||||
 | 
					 cprintf(" 2 Bajas          <20> nRegT: %ld \r\n", DummyBase.NRegTotal() );
 | 
				
			||||||
 | 
					 cprintf(" 3 Modificaciones <20> CReg:  %ld \r\n", DummyBase.RegActual() );
 | 
				
			||||||
 | 
					 cprintf(" 4 Listar         <20>     ---    \r\n");
 | 
				
			||||||
 | 
					 cprintf(" 5 Cortar Fichero <20> _-<2D> J.D <20>-_\r\n");
 | 
				
			||||||
 | 
					 cprintf("                  <20> <20>-_ F.V _-<2D>\r\n");
 | 
				
			||||||
 | 
					 cprintf(" 0 Salir al DOS   <20>     ---     \r\n");
 | 
				
			||||||
 | 
					 cprintf("                  <20> F R i      \r\n");
 | 
				
			||||||
 | 
					 cprintf(" 6 Ins. Especial  <20>  u e S     \r\n");
 | 
				
			||||||
 | 
					 cprintf(" 7 Ordenar Campo  <20>   T N i    \r\n");
 | 
				
			||||||
 | 
					 cprintf("                  <20>    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<63>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<DummyBase.Registros(); i++ )
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if ( DummyBase.LeeReg( (void *)&dummy, i ) != 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 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  getch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int Busca( char *nombre )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 int i, enc = ERROR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 for( i=0; i<DummyBase.Registros() && enc != OK; i++ )
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if ( DummyBase.LeeReg( (void *)&dummy, i ) != OK )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						 cprintf("\r\nSe producio un error: %d", DummyBase.lError );
 | 
				
			||||||
 | 
						 cprintf("\r\n%s\r\n", DummyBase.cError );
 | 
				
			||||||
 | 
						 DummyBase.CerrarReg();
 | 
				
			||||||
 | 
						 exit(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					    if ( strcmp( dummy.nombre, nombre ) == 0 )
 | 
				
			||||||
 | 
											enc = OK;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return enc;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int fcmp( const void *A, const void *B )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 return strcmp( ((DummyStruct *)A) -> nombre, ((DummyStruct *)B) -> nombre );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Reference in New Issue
	
	Block a user