Ampliar el espacio de direccionamiento de un archivo de acceso directo con datos

Iniciado por 3MP3R0R, 9 Noviembre 2012, 06:41 AM

0 Miembros y 1 Visitante están viendo este tema.

3MP3R0R

Hola a todos, tengo un programa que necesita una mejora, llegue hasta acá, y la verdad no estoy muy seguro que este muy bien... me falta, como dice en el asunto, Ampliar el espacio de direccionamiento de un archivo de acceso directo con datos.

Espero puedan ayudarme, muchas gracias de ante mano, les dejo el código que tengo...

#include <iostream>
#include <fstream>
using namespace std;
#define MAX_TAM 23

struct reg_alumno {
        int cod;
        char nom[30];
        unsigned short edad;
        char cel[20];
        reg_alumno();
        void mostrar();
        void leecod();
        void leeresto();
        void leetodo();
        };

        fstream myfile; //// el fichero es una variable GLOBAL

bool confirma (const char *c) {
char resp[30];
cout << c << endl;
cout << "¿lo confirma (s/n)?: ";
cin.getline(resp, 30);
if ( toupper(resp[0])=='S')
    return true;
else
     return false;
}

reg_alumno::reg_alumno() {
     cod=0;
}

void reg_alumno::mostrar() {
     cout.width(5);
     cout<<right<<cod<<" ";
     cout.width(31);
     cout<<left<<nom;
     cout.width(6);
     cout<<edad;
     cout.width(20);
     cout<<cel;
     cout.clear();
}

void reg_alumno::leecod() {
char aux[30];
      cout<< "Codigo: ";
      cin.getline(aux,30);
      cod=atoi(aux);
}

void reg_alumno::leeresto() {
      char aux[30];
      cout<< "Nombre: ";
      cin.getline(nom, 30);
      cout<< "Edad: ";
      cin.getline(aux,30);
      edad=atoi(aux);
      cout<< "Celular: ";
      cin.getline(cel,20);
      }

void reg_alumno::leetodo() {
      leecod();
      leeresto();
      }

// función de direccionamiento (hashing)
// se asume que el fichero está abierto

int hashing(int cod) {
     return cod % MAX_TAM;
}

void ini_arch(){
      reg_alumno al;
      myfile.seekp(0,ios::beg); // mueve el puntero put (de escritura)
      al.cod=0; // el codigo cero señala un registro vacio
      for (int i=0; i<MAX_TAM; i++)
          myfile.write ((char *) &al, sizeof(al));
          }

// crear el archivo

void crear_arch() {
      if ( confirma("Se realizara la creacion del archivo vacio\n") ) {
         ini_arch();
         cout << "El archivo fue inicializado\n";
      }
      else
          cout << "El archivo no fue inicializado\n";
          }

// Listar el contenido del archivo
void listar_arch() {
      reg_alumno al; int n,dir;
      myfile.seekg(0);
      n=0; dir=0;
      myfile.read ((char *) &al, sizeof(al));
      while (!myfile.eof()) {
            if (al.cod) {
               cout.width(4);
               cout << right << dir << " ";
               al.mostrar();
               cout << endl;
               n++;
            }
      dir++;
      myfile.read ((char *) &al, sizeof(al));
      }
cout << "Se tienen " << n << " registros en el fichero\n";
myfile.clear();
}

void adicion_arch() { // Añadir contenido al archivo
      reg_alumno al, dato;
      int dir, intentos;
      bool grabado;
      cout << "Adicion de datos, introduzca la informacion\n\n";
      al.leetodo();
      dir=hashing(al.cod);
      intentos=0;
      grabado=false;
      while (intentos < MAX_TAM and !grabado) {
            intentos++;
            myfile.seekg(dir*sizeof(reg_alumno), ios::beg);
            myfile.read ((char *) &dato, sizeof(reg_alumno));
            if (dato.cod==0) {
               myfile.seekp (dir*sizeof(reg_alumno), ios::beg);
               myfile.write ((char *) &al, sizeof(reg_alumno));
               grabado=true;
               cout << "Datos almacenados en registro " << dir<<endl;
               }
            else {
                 if (dato.cod==al.cod) {
                    cout << "El codigo ya existe en el archivo. No puede duplicarse\n";
                    grabado=true; // fuerza la salida del proceso
                    }
                 else
                     dir = hashing(al.cod+intentos*11); // relocalización lineal a =11
                     }
            intentos++;
            }
            if (intentos==MAX_TAM)
               cout << "No se puede anadir el registro\n ";
               }

// busca un registro en el archivo
// si fracasa devuelve un negativo
// se supone que el archivo está abierto
int busca_reg(reg_alumno *dato) {
reg_alumno al;
int dir, intentos;
bool encontrado;
cout << "Busqueda de datos\n\n";
al.leecod();
dir=hashing(al.cod);
intentos=0;
encontrado=false;
while (intentos < MAX_TAM and !encontrado) {
       intentos++;
       myfile.seekg(dir*sizeof(reg_alumno), ios ::beg);
       myfile.read ((char *) dato, sizeof( reg_alumno));
       if (dato->cod==al.cod) {
          encontrado=true;
          cout<< "Registro encontrado en direccion: "<<dir<<endl;
          dato->mostrar();
          }
       else
           dir = hashing(al.cod + intentos*11); // relocalización lineal a=11
           intentos++;
           }
       if (intentos==MAX_TAM && !encontrado) {
          cout << "No se puede localizar el registro\n";
          dir=-1;
          }
          return dir;
          }

// Modificar contenido del archivo
void modifica_arch() {
      reg_alumno al, dato;
      int dir;
      cout << "Modificacion de datos\n\n";
      dir=busca_reg(&dato);
      if (dir>=0) {
         cout<< "\nIntroduzca nuevos datos\n";
         al.cod=dato.cod;
         al.leeresto();
         if (confirma("Grabar los nuevos datos. ") ) {
            myfile.seekp (dir*sizeof(reg_alumno), ios::beg);
            myfile.write ((char *) &al, sizeof( reg_alumno));
            cout << "Datos modificados en registro " << dir<<endl;
            }
         else
         cout << "Los datos no fueron modificados\n";
         }
         }

// Elimina lógicamente un registro del archivo
void elimina_arch() {
      reg_alumno dato;
      int dir;
      cout << "Eliminacion de datos\n\n";
      dir=busca_reg(&dato);
      if (dir>=0) {
         if (confirma("Eliminar el registro. ")) { 
         dato.cod=0;
         myfile.seekp (dir*sizeof(reg_alumno), ios::beg);
         myfile.write ((char *) &dato, sizeof( reg_alumno));
         cout << "Datos eliminados en registro " << dir<<endl;
      }
      else
          cout << "Los datos no fueron borrados \n";
      }
}

// Busca un registro en el archivo
void busca_arch() {
  reg_alumno dato;
  busca_reg (&dato);
  }

int main(int argc, const char * argv[])
{
char resp[30];
myfile.open("dato_alum.dat", ios::in | ios:: binary); // abre el archivo para lectura
if (!myfile.is_open()) { // si el archivo no existe lo inicializa
    myfile.open("dato_alum.dat", ios::out|ios::binary); // abre para escritura
    ini_arch(); // inicializa
    }
    myfile.close(); // cierra para abrirlo en lectura y escritura;
    myfile.open("dato_alum.dat", ios::in |ios::out|ios::binary);
    if (myfile.is_open()) {
       do {
          cout << "\nC - Crear el archivo \n";
          cout << "A - Anadir datos \n";
          cout << "M - Modificar datos\n";
          cout << "E - Eliminar datos\n";
          cout << "B - Buscar datos\n";
          cout << "L - Listado de todos los datos\n";
          cout << "S - Salir del programa\n";
          cout << "\nOpcion:";
          cin.getline(resp, 30);
          switch (toupper(resp[0])) {
                 case 'C':
                      crear_arch();
                 break;
                 case 'A':
                      adicion_arch();
                 break;
                 case 'M':
                      modifica_arch();
                 break;
                 case 'E':
                      elimina_arch();
                 break;
                 case 'B':
                      busca_arch();
                 break;
                 case 'L':
                      listar_arch();
                 }
          } while ( toupper(resp[0])!='S');
          }
       else {
            cout << "El fichero no puede abrirse\n" ;
            }
            myfile.close();
            return 0;
            }