elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ampliar el espacio de direccionamiento de un archivo de acceso directo con datos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ampliar el espacio de direccionamiento de un archivo de acceso directo con datos  (Leído 1,026 veces)
3MP3R0R

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Ampliar el espacio de direccionamiento de un archivo de acceso directo con datos
« en: 9 Noviembre 2012, 06:41 am »

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;
            }


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines